UNPKG

projen

Version:

CDK for software projects

179 lines • 27.4 kB
"use strict"; var _a; Object.defineProperty(exports, "__esModule", { value: true }); exports.WorkflowSteps = exports.CheckoutSubmodules = void 0; const JSII_RTTI_SYMBOL_1 = Symbol.for("jsii.rtti"); const object_1 = require("../util/object"); /** * Whether to checkout Git submodules in CI workflows. */ var CheckoutSubmodules; (function (CheckoutSubmodules) { /** * Don't checkout submodules. */ CheckoutSubmodules["DISABLED"] = "false"; /** * Checkout only top-level submodules. */ CheckoutSubmodules["ENABLED"] = "true"; /** * Checkout submodules recursively. */ CheckoutSubmodules["RECURSIVE"] = "recursive"; })(CheckoutSubmodules || (exports.CheckoutSubmodules = CheckoutSubmodules = {})); /** * A collection of very commonly used, individual, GitHub Workflow Job steps. */ class WorkflowSteps { /** * Checks out a repository. * * @param options Options to configure the `checkout` JobStep * @returns A JobStep that checks out a repository */ static checkout(options = {}) { const checkoutWith = (0, object_1.removeNullOrUndefinedProperties)({ "fetch-depth": options?.with?.fetchDepth, token: options?.with?.token, ref: options?.with?.ref, repository: options?.with?.repository, path: options?.with?.path, ...(options?.with?.lfs ? { lfs: true } : {}), ...(options?.with?.submodules && options.with.submodules !== CheckoutSubmodules.DISABLED ? { submodules: options.with.submodules === CheckoutSubmodules.RECURSIVE ? "recursive" : true, } : {}), }); return { ...this.buildJobStepConfig({ ...options, name: options.name ?? "Checkout", }), uses: "actions/checkout@v6", with: Object.keys(checkoutWith).length > 0 ? checkoutWith : undefined, }; } /** * Configures the git identity (user name and email). * * @param options Options to configure the git identity JobStep * @returns Job step that configures the provided git identity */ static setupGitIdentity(options) { return { ...this.buildJobStepConfig({ ...options, name: options.name ?? "Set git identity", }), run: [ `git config user.name "${options.gitIdentity.name}"`, `git config user.email "${options.gitIdentity.email}"`, ].join("\n"), }; } /** * Checks if a tag exists. * * Requires a checkout step to have been run before this step with "fetch-depth" set to "0". * * Outputs: * - `exists`: A string value of 'true' or 'false' indicating if the tag exists. * * @param tag The tag to check. You may use valid bash code instead of a literal string in this field. * @param options Options to configure the `tag-exists` JobStep * @returns Job step that checks if the provided tag exists */ static tagExists(tag, options) { const checkTag = (remoteTag) => `git ls-remote -q --exit-code --tags origin ${remoteTag}`; const varIsSet = (variable) => `[ ! -z "$${variable}" ]`; const setOutput = (value) => `(echo "exists=${value ? "true" : "false"}" >> $GITHUB_OUTPUT)`; return { ...this.buildJobStepConfig({ ...options, name: options.name ?? "Check if tag exists", id: options.id ?? "check-tag", shell: "bash", }), run: [ `TAG=${tag}`, `(${varIsSet("TAG")} && ${checkTag("$TAG")} && ${setOutput(true)}) || ${setOutput(false)}`, "cat $GITHUB_OUTPUT", ].join("\n"), }; } /** * Uploads an artifact. * * @param options Options to configure the `upload-artifact` JobStep * @returns A JobStep that uploads an artifact */ static uploadArtifact(options) { const uploadArtifactWith = (0, object_1.removeNullOrUndefinedProperties)({ name: options?.with?.name, path: options?.with?.path, overwrite: options?.with?.overwrite ?? true, "if-no-files-found": options?.with?.ifNoFilesFound, "retention-days": options?.with?.retentionDays, "compression-level": options?.with?.compressionLevel, "include-hidden-files": options?.with?.includeHiddenFiles, }); return { ...this.buildJobStepConfig({ ...options, name: options.name ?? "Upload artifact", }), uses: "actions/upload-artifact@v7", with: uploadArtifactWith, }; } /** * Downloads an artifact. * * @param options Options to configure the `download-artifact` JobStep * @returns A JobStep that downloads an artifact */ static downloadArtifact(options) { const downloadArtifactWith = options?.with ? (0, object_1.removeNullOrUndefinedProperties)({ name: options?.with?.name, path: options?.with?.path, pattern: options?.with?.pattern, repository: options?.with?.repository, "merge-multiple": options?.with?.mergeMultiple, "github-token": options?.with?.token, "run-id": options?.with?.runId, }) : undefined; return { ...this.buildJobStepConfig({ ...options, name: options?.name ?? "Download artifact", }), uses: "actions/download-artifact@v8", with: downloadArtifactWith, }; } /** * Simple adapter to ensure we only include the necessary fields for a JobStepConfiguration. */ static buildJobStepConfig(options) { return { continueOnError: options?.continueOnError, env: options?.env, id: options?.id, if: options?.if, name: options?.name, timeoutMinutes: options?.timeoutMinutes, workingDirectory: options?.workingDirectory, }; } } exports.WorkflowSteps = WorkflowSteps; _a = JSII_RTTI_SYMBOL_1; WorkflowSteps[_a] = { fqn: "projen.github.WorkflowSteps", version: "0.99.64" }; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid29ya2Zsb3ctc3RlcHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvZ2l0aHViL3dvcmtmbG93LXN0ZXBzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7O0FBRUEsMkNBQWlFO0FBRWpFOztHQUVHO0FBQ0gsSUFBWSxrQkFlWDtBQWZELFdBQVksa0JBQWtCO0lBQzVCOztPQUVHO0lBQ0gsd0NBQWtCLENBQUE7SUFFbEI7O09BRUc7SUFDSCxzQ0FBZ0IsQ0FBQTtJQUVoQjs7T0FFRztJQUNILDZDQUF1QixDQUFBO0FBQ3pCLENBQUMsRUFmVyxrQkFBa0Isa0NBQWxCLGtCQUFrQixRQWU3QjtBQUVEOztHQUVHO0FBQ0gsTUFBYSxhQUFhO0lBQ3hCOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLFFBQVEsQ0FBQyxVQUEyQixFQUFFO1FBQ2xELE1BQU0sWUFBWSxHQUFHLElBQUEsd0NBQStCLEVBQUM7WUFDbkQsYUFBYSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVTtZQUN4QyxLQUFLLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLO1lBQzNCLEdBQUcsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUc7WUFDdkIsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVTtZQUNyQyxJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJO1lBQ3pCLEdBQUcsQ0FBQyxPQUFPLEVBQUUsSUFBSSxFQUFFLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxHQUFHLEVBQUUsSUFBSSxFQUFFLENBQUMsQ0FBQyxDQUFDLEVBQUUsQ0FBQztZQUM1QyxHQUFHLENBQUMsT0FBTyxFQUFFLElBQUksRUFBRSxVQUFVO2dCQUM3QixPQUFPLENBQUMsSUFBSSxDQUFDLFVBQVUsS0FBSyxrQkFBa0IsQ0FBQyxRQUFRO2dCQUNyRCxDQUFDLENBQUM7b0JBQ0UsVUFBVSxFQUNSLE9BQU8sQ0FBQyxJQUFJLENBQUMsVUFBVSxLQUFLLGtCQUFrQixDQUFDLFNBQVM7d0JBQ3RELENBQUMsQ0FBQyxXQUFXO3dCQUNiLENBQUMsQ0FBQyxJQUFJO2lCQUNYO2dCQUNILENBQUMsQ0FBQyxFQUFFLENBQUM7U0FDUixDQUFDLENBQUM7UUFFSCxPQUFPO1lBQ0wsR0FBRyxJQUFJLENBQUMsa0JBQWtCLENBQUM7Z0JBQ3pCLEdBQUcsT0FBTztnQkFDVixJQUFJLEVBQUUsT0FBTyxDQUFDLElBQUksSUFBSSxVQUFVO2FBQ2pDLENBQUM7WUFDRixJQUFJLEVBQUUscUJBQXFCO1lBQzNCLElBQUksRUFBRSxNQUFNLENBQUMsSUFBSSxDQUFDLFlBQVksQ0FBQyxDQUFDLE1BQU0sR0FBRyxDQUFDLENBQUMsQ0FBQyxDQUFDLFlBQVksQ0FBQyxDQUFDLENBQUMsU0FBUztTQUN0RSxDQUFDO0lBQ0osQ0FBQztJQUVEOzs7OztPQUtHO0lBQ0ksTUFBTSxDQUFDLGdCQUFnQixDQUFDLE9BQWdDO1FBQzdELE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDekIsR0FBRyxPQUFPO2dCQUNWLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLGtCQUFrQjthQUN6QyxDQUFDO1lBQ0YsR0FBRyxFQUFFO2dCQUNILHlCQUF5QixPQUFPLENBQUMsV0FBVyxDQUFDLElBQUksR0FBRztnQkFDcEQsMEJBQTBCLE9BQU8sQ0FBQyxXQUFXLENBQUMsS0FBSyxHQUFHO2FBQ3ZELENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNiLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7Ozs7Ozs7O09BV0c7SUFDSSxNQUFNLENBQUMsU0FBUyxDQUFDLEdBQVcsRUFBRSxPQUE2QjtRQUNoRSxNQUFNLFFBQVEsR0FBRyxDQUFDLFNBQWlCLEVBQUUsRUFBRSxDQUNyQyw4Q0FBOEMsU0FBUyxFQUFFLENBQUM7UUFDNUQsTUFBTSxRQUFRLEdBQUcsQ0FBQyxRQUFnQixFQUFFLEVBQUUsQ0FBQyxZQUFZLFFBQVEsS0FBSyxDQUFDO1FBQ2pFLE1BQU0sU0FBUyxHQUFHLENBQUMsS0FBYyxFQUFFLEVBQUUsQ0FDbkMsaUJBQWlCLEtBQUssQ0FBQyxDQUFDLENBQUMsTUFBTSxDQUFDLENBQUMsQ0FBQyxPQUFPLHNCQUFzQixDQUFDO1FBRWxFLE9BQU87WUFDTCxHQUFHLElBQUksQ0FBQyxrQkFBa0IsQ0FBQztnQkFDekIsR0FBRyxPQUFPO2dCQUNWLElBQUksRUFBRSxPQUFPLENBQUMsSUFBSSxJQUFJLHFCQUFxQjtnQkFDM0MsRUFBRSxFQUFFLE9BQU8sQ0FBQyxFQUFFLElBQUksV0FBVztnQkFDN0IsS0FBSyxFQUFFLE1BQU07YUFDZCxDQUFDO1lBQ0YsR0FBRyxFQUFFO2dCQUNILE9BQU8sR0FBRyxFQUFFO2dCQUNaLElBQUksUUFBUSxDQUFDLEtBQUssQ0FBQyxPQUFPLFFBQVEsQ0FBQyxNQUFNLENBQUMsT0FBTyxTQUFTLENBQ3hELElBQUksQ0FDTCxRQUFRLFNBQVMsQ0FBQyxLQUFLLENBQUMsRUFBRTtnQkFDM0Isb0JBQW9CO2FBQ3JCLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQztTQUNiLENBQUM7SUFDSixDQUFDO0lBRUQ7Ozs7O09BS0c7SUFDSSxNQUFNLENBQUMsY0FBYyxDQUFDLE9BQThCO1FBQ3pELE1BQU0sa0JBQWtCLEdBQ3RCLElBQUEsd0NBQStCLEVBQUM7WUFDOUIsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSTtZQUN6QixJQUFJLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxJQUFJO1lBQ3pCLFNBQVMsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLFNBQVMsSUFBSSxJQUFJO1lBQzNDLG1CQUFtQixFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsY0FBYztZQUNsRCxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsSUFBSSxFQUFFLGFBQWE7WUFDOUMsbUJBQW1CLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxnQkFBZ0I7WUFDcEQsc0JBQXNCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxrQkFBa0I7U0FDMUQsQ0FBQyxDQUFDO1FBRUwsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUN6QixHQUFHLE9BQU87Z0JBQ1YsSUFBSSxFQUFFLE9BQU8sQ0FBQyxJQUFJLElBQUksaUJBQWlCO2FBQ3hDLENBQUM7WUFDRixJQUFJLEVBQUUsNEJBQTRCO1lBQ2xDLElBQUksRUFBRSxrQkFBa0I7U0FDekIsQ0FBQztJQUNKLENBQUM7SUFFRDs7Ozs7T0FLRztJQUNJLE1BQU0sQ0FBQyxnQkFBZ0IsQ0FBQyxPQUFpQztRQUM5RCxNQUFNLG9CQUFvQixHQUFxQyxPQUFPLEVBQUUsSUFBSTtZQUMxRSxDQUFDLENBQUMsSUFBQSx3Q0FBK0IsRUFBQztnQkFDOUIsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSTtnQkFDekIsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsSUFBSTtnQkFDekIsT0FBTyxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsT0FBTztnQkFDL0IsVUFBVSxFQUFFLE9BQU8sRUFBRSxJQUFJLEVBQUUsVUFBVTtnQkFDckMsZ0JBQWdCLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxhQUFhO2dCQUM5QyxjQUFjLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLO2dCQUNwQyxRQUFRLEVBQUUsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLO2FBQy9CLENBQUM7WUFDSixDQUFDLENBQUMsU0FBUyxDQUFDO1FBRWQsT0FBTztZQUNMLEdBQUcsSUFBSSxDQUFDLGtCQUFrQixDQUFDO2dCQUN6QixHQUFHLE9BQU87Z0JBQ1YsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJLElBQUksbUJBQW1CO2FBQzNDLENBQUM7WUFDRixJQUFJLEVBQUUsOEJBQThCO1lBQ3BDLElBQUksRUFBRSxvQkFBb0I7U0FDM0IsQ0FBQztJQUNKLENBQUM7SUFFRDs7T0FFRztJQUNLLE1BQU0sQ0FBQyxrQkFBa0IsQ0FDL0IsT0FBNkI7UUFFN0IsT0FBTztZQUNMLGVBQWUsRUFBRSxPQUFPLEVBQUUsZUFBZTtZQUN6QyxHQUFHLEVBQUUsT0FBTyxFQUFFLEdBQUc7WUFDakIsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2YsRUFBRSxFQUFFLE9BQU8sRUFBRSxFQUFFO1lBQ2YsSUFBSSxFQUFFLE9BQU8sRUFBRSxJQUFJO1lBQ25CLGNBQWMsRUFBRSxPQUFPLEVBQUUsY0FBYztZQUN2QyxnQkFBZ0IsRUFBRSxPQUFPLEVBQUUsZ0JBQWdCO1NBQzVDLENBQUM7SUFDSixDQUFDOztBQW5LSCxzQ0FvS0MiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgdHlwZSB7IEdpdElkZW50aXR5IH0gZnJvbSBcIi4vdGFzay13b3JrZmxvd1wiO1xuaW1wb3J0IHR5cGUgeyBKb2JTdGVwQ29uZmlndXJhdGlvbiwgSm9iU3RlcCB9IGZyb20gXCIuL3dvcmtmbG93cy1tb2RlbFwiO1xuaW1wb3J0IHsgcmVtb3ZlTnVsbE9yVW5kZWZpbmVkUHJvcGVydGllcyB9IGZyb20gXCIuLi91dGlsL29iamVjdFwiO1xuXG4vKipcbiAqIFdoZXRoZXIgdG8gY2hlY2tvdXQgR2l0IHN1Ym1vZHVsZXMgaW4gQ0kgd29ya2Zsb3dzLlxuICovXG5leHBvcnQgZW51bSBDaGVja291dFN1Ym1vZHVsZXMge1xuICAvKipcbiAgICogRG9uJ3QgY2hlY2tvdXQgc3VibW9kdWxlcy5cbiAgICovXG4gIERJU0FCTEVEID0gXCJmYWxzZVwiLFxuXG4gIC8qKlxuICAgKiBDaGVja291dCBvbmx5IHRvcC1sZXZlbCBzdWJtb2R1bGVzLlxuICAgKi9cbiAgRU5BQkxFRCA9IFwidHJ1ZVwiLFxuXG4gIC8qKlxuICAgKiBDaGVja291dCBzdWJtb2R1bGVzIHJlY3Vyc2l2ZWx5LlxuICAgKi9cbiAgUkVDVVJTSVZFID0gXCJyZWN1cnNpdmVcIixcbn1cblxuLyoqXG4gKiBBIGNvbGxlY3Rpb24gb2YgdmVyeSBjb21tb25seSB1c2VkLCBpbmRpdmlkdWFsLCBHaXRIdWIgV29ya2Zsb3cgSm9iIHN0ZXBzLlxuICovXG5leHBvcnQgY2xhc3MgV29ya2Zsb3dTdGVwcyB7XG4gIC8qKlxuICAgKiBDaGVja3Mgb3V0IGEgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogQHBhcmFtIG9wdGlvbnMgT3B0aW9ucyB0byBjb25maWd1cmUgdGhlIGBjaGVja291dGAgSm9iU3RlcFxuICAgKiBAcmV0dXJucyBBIEpvYlN0ZXAgdGhhdCBjaGVja3Mgb3V0IGEgcmVwb3NpdG9yeVxuICAgKi9cbiAgcHVibGljIHN0YXRpYyBjaGVja291dChvcHRpb25zOiBDaGVja291dE9wdGlvbnMgPSB7fSk6IEpvYlN0ZXAge1xuICAgIGNvbnN0IGNoZWNrb3V0V2l0aCA9IHJlbW92ZU51bGxPclVuZGVmaW5lZFByb3BlcnRpZXMoe1xuICAgICAgXCJmZXRjaC1kZXB0aFwiOiBvcHRpb25zPy53aXRoPy5mZXRjaERlcHRoLFxuICAgICAgdG9rZW46IG9wdGlvbnM/LndpdGg/LnRva2VuLFxuICAgICAgcmVmOiBvcHRpb25zPy53aXRoPy5yZWYsXG4gICAgICByZXBvc2l0b3J5OiBvcHRpb25zPy53aXRoPy5yZXBvc2l0b3J5LFxuICAgICAgcGF0aDogb3B0aW9ucz8ud2l0aD8ucGF0aCxcbiAgICAgIC4uLihvcHRpb25zPy53aXRoPy5sZnMgPyB7IGxmczogdHJ1ZSB9IDoge30pLFxuICAgICAgLi4uKG9wdGlvbnM/LndpdGg/LnN1Ym1vZHVsZXMgJiZcbiAgICAgIG9wdGlvbnMud2l0aC5zdWJtb2R1bGVzICE9PSBDaGVja291dFN1Ym1vZHVsZXMuRElTQUJMRURcbiAgICAgICAgPyB7XG4gICAgICAgICAgICBzdWJtb2R1bGVzOlxuICAgICAgICAgICAgICBvcHRpb25zLndpdGguc3VibW9kdWxlcyA9PT0gQ2hlY2tvdXRTdWJtb2R1bGVzLlJFQ1VSU0lWRVxuICAgICAgICAgICAgICAgID8gXCJyZWN1cnNpdmVcIlxuICAgICAgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICB9XG4gICAgICAgIDoge30pLFxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuYnVpbGRKb2JTdGVwQ29uZmlnKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbmFtZTogb3B0aW9ucy5uYW1lID8/IFwiQ2hlY2tvdXRcIixcbiAgICAgIH0pLFxuICAgICAgdXNlczogXCJhY3Rpb25zL2NoZWNrb3V0QHY2XCIsXG4gICAgICB3aXRoOiBPYmplY3Qua2V5cyhjaGVja291dFdpdGgpLmxlbmd0aCA+IDAgPyBjaGVja291dFdpdGggOiB1bmRlZmluZWQsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDb25maWd1cmVzIHRoZSBnaXQgaWRlbnRpdHkgKHVzZXIgbmFtZSBhbmQgZW1haWwpLlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgZ2l0IGlkZW50aXR5IEpvYlN0ZXBcbiAgICogQHJldHVybnMgSm9iIHN0ZXAgdGhhdCBjb25maWd1cmVzIHRoZSBwcm92aWRlZCBnaXQgaWRlbnRpdHlcbiAgICovXG4gIHB1YmxpYyBzdGF0aWMgc2V0dXBHaXRJZGVudGl0eShvcHRpb25zOiBTZXR1cEdpdElkZW50aXR5T3B0aW9ucyk6IEpvYlN0ZXAge1xuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJ1aWxkSm9iU3RlcENvbmZpZyh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSA/PyBcIlNldCBnaXQgaWRlbnRpdHlcIixcbiAgICAgIH0pLFxuICAgICAgcnVuOiBbXG4gICAgICAgIGBnaXQgY29uZmlnIHVzZXIubmFtZSBcIiR7b3B0aW9ucy5naXRJZGVudGl0eS5uYW1lfVwiYCxcbiAgICAgICAgYGdpdCBjb25maWcgdXNlci5lbWFpbCBcIiR7b3B0aW9ucy5naXRJZGVudGl0eS5lbWFpbH1cImAsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBDaGVja3MgaWYgYSB0YWcgZXhpc3RzLlxuICAgKlxuICAgKiBSZXF1aXJlcyBhIGNoZWNrb3V0IHN0ZXAgdG8gaGF2ZSBiZWVuIHJ1biBiZWZvcmUgdGhpcyBzdGVwIHdpdGggXCJmZXRjaC1kZXB0aFwiIHNldCB0byBcIjBcIi5cbiAgICpcbiAgICogT3V0cHV0czpcbiAgICogLSBgZXhpc3RzYDogQSBzdHJpbmcgdmFsdWUgb2YgJ3RydWUnIG9yICdmYWxzZScgaW5kaWNhdGluZyBpZiB0aGUgdGFnIGV4aXN0cy5cbiAgICpcbiAgICogQHBhcmFtIHRhZyBUaGUgdGFnIHRvIGNoZWNrLiBZb3UgbWF5IHVzZSB2YWxpZCBiYXNoIGNvZGUgaW5zdGVhZCBvZiBhIGxpdGVyYWwgc3RyaW5nIGluIHRoaXMgZmllbGQuXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBgdGFnLWV4aXN0c2AgSm9iU3RlcFxuICAgKiBAcmV0dXJucyBKb2Igc3RlcCB0aGF0IGNoZWNrcyBpZiB0aGUgcHJvdmlkZWQgdGFnIGV4aXN0c1xuICAgKi9cbiAgcHVibGljIHN0YXRpYyB0YWdFeGlzdHModGFnOiBzdHJpbmcsIG9wdGlvbnM6IEpvYlN0ZXBDb25maWd1cmF0aW9uKTogSm9iU3RlcCB7XG4gICAgY29uc3QgY2hlY2tUYWcgPSAocmVtb3RlVGFnOiBzdHJpbmcpID0+XG4gICAgICBgZ2l0IGxzLXJlbW90ZSAtcSAtLWV4aXQtY29kZSAtLXRhZ3Mgb3JpZ2luICR7cmVtb3RlVGFnfWA7XG4gICAgY29uc3QgdmFySXNTZXQgPSAodmFyaWFibGU6IHN0cmluZykgPT4gYFsgISAteiBcIiQke3ZhcmlhYmxlfVwiIF1gO1xuICAgIGNvbnN0IHNldE91dHB1dCA9ICh2YWx1ZTogYm9vbGVhbikgPT5cbiAgICAgIGAoZWNobyBcImV4aXN0cz0ke3ZhbHVlID8gXCJ0cnVlXCIgOiBcImZhbHNlXCJ9XCIgPj4gJEdJVEhVQl9PVVRQVVQpYDtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJ1aWxkSm9iU3RlcENvbmZpZyh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSA/PyBcIkNoZWNrIGlmIHRhZyBleGlzdHNcIixcbiAgICAgICAgaWQ6IG9wdGlvbnMuaWQgPz8gXCJjaGVjay10YWdcIixcbiAgICAgICAgc2hlbGw6IFwiYmFzaFwiLFxuICAgICAgfSksXG4gICAgICBydW46IFtcbiAgICAgICAgYFRBRz0ke3RhZ31gLFxuICAgICAgICBgKCR7dmFySXNTZXQoXCJUQUdcIil9ICYmICR7Y2hlY2tUYWcoXCIkVEFHXCIpfSAmJiAke3NldE91dHB1dChcbiAgICAgICAgICB0cnVlLFxuICAgICAgICApfSkgfHwgJHtzZXRPdXRwdXQoZmFsc2UpfWAsXG4gICAgICAgIFwiY2F0ICRHSVRIVUJfT1VUUFVUXCIsXG4gICAgICBdLmpvaW4oXCJcXG5cIiksXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBVcGxvYWRzIGFuIGFydGlmYWN0LlxuICAgKlxuICAgKiBAcGFyYW0gb3B0aW9ucyBPcHRpb25zIHRvIGNvbmZpZ3VyZSB0aGUgYHVwbG9hZC1hcnRpZmFjdGAgSm9iU3RlcFxuICAgKiBAcmV0dXJucyBBIEpvYlN0ZXAgdGhhdCB1cGxvYWRzIGFuIGFydGlmYWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIHVwbG9hZEFydGlmYWN0KG9wdGlvbnM6IFVwbG9hZEFydGlmYWN0T3B0aW9ucyk6IEpvYlN0ZXAge1xuICAgIGNvbnN0IHVwbG9hZEFydGlmYWN0V2l0aDogVXBsb2FkQXJ0aWZhY3RXaXRoID1cbiAgICAgIHJlbW92ZU51bGxPclVuZGVmaW5lZFByb3BlcnRpZXMoe1xuICAgICAgICBuYW1lOiBvcHRpb25zPy53aXRoPy5uYW1lLFxuICAgICAgICBwYXRoOiBvcHRpb25zPy53aXRoPy5wYXRoLFxuICAgICAgICBvdmVyd3JpdGU6IG9wdGlvbnM/LndpdGg/Lm92ZXJ3cml0ZSA/PyB0cnVlLFxuICAgICAgICBcImlmLW5vLWZpbGVzLWZvdW5kXCI6IG9wdGlvbnM/LndpdGg/LmlmTm9GaWxlc0ZvdW5kLFxuICAgICAgICBcInJldGVudGlvbi1kYXlzXCI6IG9wdGlvbnM/LndpdGg/LnJldGVudGlvbkRheXMsXG4gICAgICAgIFwiY29tcHJlc3Npb24tbGV2ZWxcIjogb3B0aW9ucz8ud2l0aD8uY29tcHJlc3Npb25MZXZlbCxcbiAgICAgICAgXCJpbmNsdWRlLWhpZGRlbi1maWxlc1wiOiBvcHRpb25zPy53aXRoPy5pbmNsdWRlSGlkZGVuRmlsZXMsXG4gICAgICB9KTtcblxuICAgIHJldHVybiB7XG4gICAgICAuLi50aGlzLmJ1aWxkSm9iU3RlcENvbmZpZyh7XG4gICAgICAgIC4uLm9wdGlvbnMsXG4gICAgICAgIG5hbWU6IG9wdGlvbnMubmFtZSA/PyBcIlVwbG9hZCBhcnRpZmFjdFwiLFxuICAgICAgfSksXG4gICAgICB1c2VzOiBcImFjdGlvbnMvdXBsb2FkLWFydGlmYWN0QHY3XCIsXG4gICAgICB3aXRoOiB1cGxvYWRBcnRpZmFjdFdpdGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBEb3dubG9hZHMgYW4gYXJ0aWZhY3QuXG4gICAqXG4gICAqIEBwYXJhbSBvcHRpb25zIE9wdGlvbnMgdG8gY29uZmlndXJlIHRoZSBgZG93bmxvYWQtYXJ0aWZhY3RgIEpvYlN0ZXBcbiAgICogQHJldHVybnMgQSBKb2JTdGVwIHRoYXQgZG93bmxvYWRzIGFuIGFydGlmYWN0XG4gICAqL1xuICBwdWJsaWMgc3RhdGljIGRvd25sb2FkQXJ0aWZhY3Qob3B0aW9ucz86IERvd25sb2FkQXJ0aWZhY3RPcHRpb25zKTogSm9iU3RlcCB7XG4gICAgY29uc3QgZG93bmxvYWRBcnRpZmFjdFdpdGg6IERvd25sb2FkQXJ0aWZhY3RXaXRoIHwgdW5kZWZpbmVkID0gb3B0aW9ucz8ud2l0aFxuICAgICAgPyByZW1vdmVOdWxsT3JVbmRlZmluZWRQcm9wZXJ0aWVzKHtcbiAgICAgICAgICBuYW1lOiBvcHRpb25zPy53aXRoPy5uYW1lLFxuICAgICAgICAgIHBhdGg6IG9wdGlvbnM/LndpdGg/LnBhdGgsXG4gICAgICAgICAgcGF0dGVybjogb3B0aW9ucz8ud2l0aD8ucGF0dGVybixcbiAgICAgICAgICByZXBvc2l0b3J5OiBvcHRpb25zPy53aXRoPy5yZXBvc2l0b3J5LFxuICAgICAgICAgIFwibWVyZ2UtbXVsdGlwbGVcIjogb3B0aW9ucz8ud2l0aD8ubWVyZ2VNdWx0aXBsZSxcbiAgICAgICAgICBcImdpdGh1Yi10b2tlblwiOiBvcHRpb25zPy53aXRoPy50b2tlbixcbiAgICAgICAgICBcInJ1bi1pZFwiOiBvcHRpb25zPy53aXRoPy5ydW5JZCxcbiAgICAgICAgfSlcbiAgICAgIDogdW5kZWZpbmVkO1xuXG4gICAgcmV0dXJuIHtcbiAgICAgIC4uLnRoaXMuYnVpbGRKb2JTdGVwQ29uZmlnKHtcbiAgICAgICAgLi4ub3B0aW9ucyxcbiAgICAgICAgbmFtZTogb3B0aW9ucz8ubmFtZSA/PyBcIkRvd25sb2FkIGFydGlmYWN0XCIsXG4gICAgICB9KSxcbiAgICAgIHVzZXM6IFwiYWN0aW9ucy9kb3dubG9hZC1hcnRpZmFjdEB2OFwiLFxuICAgICAgd2l0aDogZG93bmxvYWRBcnRpZmFjdFdpdGgsXG4gICAgfTtcbiAgfVxuXG4gIC8qKlxuICAgKiBTaW1wbGUgYWRhcHRlciB0byBlbnN1cmUgd2Ugb25seSBpbmNsdWRlIHRoZSBuZWNlc3NhcnkgZmllbGRzIGZvciBhIEpvYlN0ZXBDb25maWd1cmF0aW9uLlxuICAgKi9cbiAgcHJpdmF0ZSBzdGF0aWMgYnVpbGRKb2JTdGVwQ29uZmlnKFxuICAgIG9wdGlvbnM6IEpvYlN0ZXBDb25maWd1cmF0aW9uLFxuICApOiBKb2JTdGVwQ29uZmlndXJhdGlvbiB7XG4gICAgcmV0dXJuIHtcbiAgICAgIGNvbnRpbnVlT25FcnJvcjogb3B0aW9ucz8uY29udGludWVPbkVycm9yLFxuICAgICAgZW52OiBvcHRpb25zPy5lbnYsXG4gICAgICBpZDogb3B0aW9ucz8uaWQsXG4gICAgICBpZjogb3B0aW9ucz8uaWYsXG4gICAgICBuYW1lOiBvcHRpb25zPy5uYW1lLFxuICAgICAgdGltZW91dE1pbnV0ZXM6IG9wdGlvbnM/LnRpbWVvdXRNaW51dGVzLFxuICAgICAgd29ya2luZ0RpcmVjdG9yeTogb3B0aW9ucz8ud29ya2luZ0RpcmVjdG9yeSxcbiAgICB9O1xuICB9XG59XG5leHBvcnQgaW50ZXJmYWNlIENoZWNrb3V0T3B0aW9ucyBleHRlbmRzIEpvYlN0ZXBDb25maWd1cmF0aW9uIHtcbiAgLyoqXG4gICAqIE9wdGlvbnMgZm9yIGBjaGVja291dGAuXG4gICAqL1xuICByZWFkb25seSB3aXRoPzogQ2hlY2tvdXRXaXRoO1xufVxuXG4vKipcbiAqIE9wdGlvbnMgZm9yIGBjaGVja291dGAuXG4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQ2hlY2tvdXRXaXRoIHtcbiAgLyoqXG4gICAqIE51bWJlciBvZiBjb21taXRzIHRvIGZldGNoLiAwIGluZGljYXRlcyBhbGwgaGlzdG9yeSBmb3IgYWxsIGJyYW5jaGVzIGFuZCB0YWdzLlxuICAgKlxuICAgKiBAZGVmYXVsdCAxXG4gICAqL1xuICByZWFkb25seSBmZXRjaERlcHRoPzogbnVtYmVyO1xuICAvKipcbiAgICogV2hldGhlciBMRlMgaXMgZW5hYmxlZCBmb3IgdGhlIEdpdEh1YiByZXBvc2l0b3J5XG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBsZnM/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGNoZWNrb3V0IEdpdCBzdWJtb2R1bGVzLlxuICAgKlxuICAgKiBAZGVmYXVsdCBDaGVja291dFN1Ym1vZHVsZXMuRElTQUJMRURcbiAgICovXG4gIHJlYWRvbmx5IHN1Ym1vZHVsZXM/OiBDaGVja291dFN1Ym1vZHVsZXM7XG5cbiAgLyoqXG4gICAqIEJyYW5jaCBvciB0YWcgbmFtZS5cbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBicmFuY2ggaXMgaW1wbGljaXRseSB1c2VkXG4gICAqL1xuICByZWFkb25seSByZWY/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5IChvd25lci9yZXBvKSB0byB1c2UuXG4gICAqIEBkZWZhdWx0IC0gdGhlIGRlZmF1bHQgcmVwb3NpdG9yeSBpcyBpbXBsaWNpdGx5IHVzZWRcbiAgICovXG4gIHJlYWRvbmx5IHJlcG9zaXRvcnk/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgR2l0SHViIHRva2VuIHRvIHVzZSB3aGVuIGNoZWNraW5nIG91dCB0aGUgcmVwb3NpdG9yeS5cbiAgICpcbiAgICogSWYgdGhlIGludGVudCBpcyB0byBwdXNoIGNoYW5nZXMgYmFjayB0byB0aGUgYnJhbmNoLCB0aGVuIHlvdSBtdXN0IHVzZSBhXG4gICAqIFBBVCB3aXRoIGByZXBvYCAoYW5kIHBvc3NpYmx5IGB3b3JrZmxvd3NgKSBwZXJtaXNzaW9ucy5cbiAgICogQGRlZmF1bHQgLSB0aGUgZGVmYXVsdCBHSVRIVUJfVE9LRU4gaXMgaW1wbGljaXRseSB1c2VkXG4gICAqL1xuICByZWFkb25seSB0b2tlbj86IHN0cmluZztcblxuICAvKipcbiAgICogUmVsYXRpdmUgcGF0aCB1bmRlciAkR0lUSFVCX1dPUktTUEFDRSB0byBwbGFjZSB0aGUgcmVwb3NpdG9yeVxuICAgKiBAZGVmYXVsdCAtICRHSVRIVUJfV09SS1NQQUNFXG4gICAqL1xuICByZWFkb25seSBwYXRoPzogc3RyaW5nO1xufVxuXG5leHBvcnQgaW50ZXJmYWNlIFNldHVwR2l0SWRlbnRpdHlPcHRpb25zIGV4dGVuZHMgSm9iU3RlcENvbmZpZ3VyYXRpb24ge1xuICAvKipcbiAgICogVGhlIGlkZW50aXR5IHRvIHVzZS5cbiAgICovXG4gIHJlYWRvbmx5IGdpdElkZW50aXR5OiBHaXRJZGVudGl0eTtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRBcnRpZmFjdFdpdGgge1xuICAvKipcbiAgICogTmFtZSBvZiB0aGUgYXJ0aWZhY3QgdG8gdXBsb2FkLlxuICAgKlxuICAgKiBAZGVmYXVsdCBcImFydGlmYWN0XCJcbiAgICovXG4gIHJlYWRvbmx5IG5hbWU/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIEEgZmlsZSwgZGlyZWN0b3J5IG9yIHdpbGRjYXJkIHBhdHRlcm4gdGhhdCBkZXNjcmliZXMgd2hhdCB0byB1cGxvYWRcbiAgICovXG4gIHJlYWRvbmx5IHBhdGg6IHN0cmluZztcblxuICAvKipcbiAgICogVGhlIGRlc2lyZWQgYmVoYXZpb3IgaWYgbm8gZmlsZXMgYXJlIGZvdW5kIHVzaW5nIHRoZSBwcm92aWRlZCBwYXRoLlxuICAgKiBBdmFpbGFibGUgT3B0aW9uczpcbiAgICogICB3YXJuOiBPdXRwdXQgYSB3YXJuaW5nIGJ1dCBkbyBub3QgZmFpbCB0aGUgYWN0aW9uXG4gICAqICAgZXJyb3I6IEZhaWwgdGhlIGFjdGlvbiB3aXRoIGFuIGVycm9yIG1lc3NhZ2VcbiAgICogICBpZ25vcmU6IERvIG5vdCBvdXRwdXQgYW55IHdhcm5pbmdzIG9yIGVycm9ycywgdGhlIGFjdGlvbiBkb2VzIG5vdCBmYWlsXG4gICAqXG4gICAqIEBkZWZhdWx0IFwid2FyblwiXG4gICAqL1xuICByZWFkb25seSBpZk5vRmlsZXNGb3VuZD86IFwiZXJyb3JcIiB8IFwid2FyblwiIHwgXCJpZ25vcmVcIjtcblxuICAvKipcbiAgICogRHVyYXRpb24gYWZ0ZXIgd2hpY2ggYXJ0aWZhY3Qgd2lsbCBleHBpcmUgaW4gZGF5cy4gMCBtZWFucyB1c2luZyBkZWZhdWx0IHJlcG9zaXRvcnkgcmV0ZW50aW9uLlxuICAgKlxuICAgKiBNaW5pbXVtIDEgZGF5LlxuICAgKiBNYXhpbXVtIDkwIGRheXMgdW5sZXNzIGNoYW5nZWQgZnJvbSB0aGUgcmVwb3NpdG9yeSBzZXR0aW5ncyBwYWdlLlxuICAgKlxuICAgKiBAZGVmYXVsdCAtIFRoZSBkZWZhdWx0IHJlcG9zaXRvcnkgcmV0ZW50aW9uXG4gICAqL1xuICByZWFkb25seSByZXRlbnRpb25EYXlzPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBUaGUgbGV2ZWwgb2YgY29tcHJlc3Npb24gZm9yIFpsaWIgdG8gYmUgYXBwbGllZCB0byB0aGUgYXJ0aWZhY3QgYXJjaGl2ZS5cbiAgICpcbiAgICogVGhlIHZhbHVlIGNhbiByYW5nZSBmcm9tIDAgdG8gOS5cbiAgICogRm9yIGxhcmdlIGZpbGVzIHRoYXQgYXJlIG5vdCBlYXNpbHkgY29tcHJlc3NlZCwgYSB2YWx1ZSBvZiAwIGlzIHJlY29tbWVuZGVkIGZvciBzaWduaWZpY2FudGx5IGZhc3RlciB1cGxvYWRzLlxuICAgKlxuICAgKiBAZGVmYXVsdCA2XG4gICAqL1xuICByZWFkb25seSBjb21wcmVzc2lvbkxldmVsPzogbnVtYmVyO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIGFjdGlvbiBzaG91bGQgb3ZlcndyaXRlIGFuIGV4aXN0aW5nIGFydGlmYWN0IHdpdGggdGhlIHNhbWUgbmFtZSAoc2hvdWxkIG9uZSBleGlzdClcbiAgICpcbiAgICogSW50cm9kdWNlZCBpbiB2NCBhbmQgcmVwcmVzZW50cyBhIGJyZWFraW5nIGNoYW5nZSBmcm9tIHRoZSBiZWhhdmlvciBvZiB0aGUgdjMgYWN0aW9uLlxuICAgKiBUbyBtYWludGFpbiBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nLCB0aGlzIHNob3VsZCBiZSBzZXQgdGhlIGB0cnVlYCAodGhlIGRlZmF1bHQpLlxuICAgKlxuICAgKiBAZGVmYXVsdCB0cnVlXG4gICAqL1xuICByZWFkb25seSBvdmVyd3JpdGU/OiBib29sZWFuO1xuXG4gIC8qKlxuICAgKiBXaGV0aGVyIHRvIGluY2x1ZGUgaGlkZGVuIGZpbGVzIGluIHRoZSBwcm92aWRlZCBwYXRoIGluIHRoZSBhcnRpZmFjdFxuICAgKlxuICAgKiBUaGUgZmlsZSBjb250ZW50cyBvZiBhbnkgaGlkZGVuIGZpbGVzIGluIHRoZSBwYXRoIHNob3VsZCBiZSB2YWxpZGF0ZWQgYmVmb3JlIGVuYWJsZWQgdGhpcyB0byBhdm9pZCB1cGxvYWRpbmcgc2Vuc2l0aXZlIGluZm9ybWF0aW9uLlxuICAgKlxuICAgKiBAZGVmYXVsdCBmYWxzZVxuICAgKi9cbiAgcmVhZG9ubHkgaW5jbHVkZUhpZGRlbkZpbGVzPzogYm9vbGVhbjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBVcGxvYWRBcnRpZmFjdE9wdGlvbnMgZXh0ZW5kcyBKb2JTdGVwQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBgdXBsb2FkLWFydGlmYWN0YC5cbiAgICovXG4gIHJlYWRvbmx5IHdpdGg6IFVwbG9hZEFydGlmYWN0V2l0aDtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBEb3dubG9hZEFydGlmYWN0V2l0aCB7XG4gIC8qKlxuICAgKiBOYW1lIG9mIHRoZSBhcnRpZmFjdCB0byBkb3dubG9hZFxuICAgKlxuICAgKiBAZGVmYXVsdCAtIElmIHVuc3BlY2lmaWVkLCBhbGwgYXJ0aWZhY3RzIGZvciB0aGUgcnVuIGFyZSBkb3dubG9hZGVkXG4gICAqL1xuICByZWFkb25seSBuYW1lPzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBBIGZpbGUsIGRpcmVjdG9yeSBvciB3aWxkY2FyZCBwYXR0ZXJuIHRoYXQgZGVzY3JpYmVzIHdoYXQgdG8gZG93bmxvYWQuIFN1cHBvcnRzIGJhc2ljIHRpbGRlIGV4cGFuc2lvbi5cbiAgICpcbiAgICogQGRlZmF1bHQgLSAkR0lUSFVCX1dPUktTUEFDRVxuICAgKi9cbiAgcmVhZG9ubHkgcGF0aD86IHN0cmluZztcblxuICAvKipcbiAgICogQSBnbG9iIHBhdHRlcm4gdG8gdGhlIGFydGlmYWN0cyB0aGF0IHNob3VsZCBiZSBkb3dubG9hZGVkXG4gICAqIFRoaXMgaXMgaWdub3JlZCBpZiBuYW1lIGlzIHNwZWNpZmllZFxuICAgKi9cbiAgcmVhZG9ubHkgcGF0dGVybj86IHN0cmluZztcblxuICAvKipcbiAgICogV2hlbiBtdWx0aXBsZSBhcnRpZmFjdHMgYXJlIG1hdGNoZWQsIHRoaXMgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yaWVzXG4gICAqIElmIHRydWUsIHRoZSBkb3dubG9hZGVkIGFydGlmYWN0cyB3aWxsIGJlIGluIHRoZSBzYW1lIGRpcmVjdG9yeSBzcGVjaWZpZWQgYnkgcGF0aFxuICAgKiBJZiBmYWxzZSwgdGhlIGRvd25sb2FkZWQgYXJ0aWZhY3RzIHdpbGwgYmUgZXh0cmFjdGVkIGludG8gaW5kaXZpZHVhbCBuYW1lZCBkaXJlY3RvcmllcyB3aXRoaW4gdGhlIHNwZWNpZmllZCBwYXRoXG4gICAqXG4gICAqIEBkZWZhdWx0IGZhbHNlXG4gICAqL1xuICByZWFkb25seSBtZXJnZU11bHRpcGxlPzogYm9vbGVhbjtcblxuICAvKipcbiAgICogVGhlIEdpdEh1YiB0b2tlbiB1c2VkIHRvIGF1dGhlbnRpY2F0ZSB3aXRoIHRoZSBHaXRIdWIgQVBJIHRvIGRvd25sb2FkIGFydGlmYWN0cyBmcm9tIGEgZGlmZmVyZW50IHJlcG9zaXRvcnkgb3IgZnJvbSBhIGRpZmZlcmVudCB3b3JrZmxvdyBydW5cbiAgICpcbiAgICogQGRlZmF1bHQgLSBJZiB1bnNwZWNpZmllZCwgdGhlIGFjdGlvbiB3aWxsIGRvd25sb2FkIGFydGlmYWN0cyBmcm9tIHRoZSBjdXJyZW50IHJlcG8gYW5kIHRoZSBjdXJyZW50IHdvcmtmbG93IHJ1blxuICAgKi9cbiAgcmVhZG9ubHkgdG9rZW4/OiBzdHJpbmc7XG5cbiAgLyoqXG4gICAqIFRoZSByZXBvc2l0b3J5IG93bmVyIGFuZCB0aGUgcmVwb3NpdG9yeSBuYW1lIGpvaW5lZCB0b2dldGhlciBieSBcIi9cIlxuICAgKiBJZiBnaXRodWItdG9rZW4gaXMgc3BlY2lmaWVkLCB0aGlzIGlzIHRoZSByZXBvc2l0b3J5IHRoYXQgYXJ0aWZhY3RzIHdpbGwgYmUgZG93bmxvYWRlZCBmcm9tXG4gICAqXG4gICAqIEBkZWZhdWx0IC0gJHt7IGdpdGh1Yi5yZXBvc2l0b3J5IH19XG4gICAqL1xuICByZWFkb25seSByZXBvc2l0b3J5Pzogc3RyaW5nO1xuXG4gIC8qKlxuICAgKiBUaGUgaWQgb2YgdGhlIHdvcmtmbG93IHJ1biB3aGVyZSB0aGUgZGVzaXJlZCBkb3dubG9hZCBhcnRpZmFjdCB3YXMgdXBsb2FkZWQgZnJvbVxuICAgKiBJZiBnaXRodWItdG9rZW4gaXMgc3BlY2lmaWVkLCB0aGlzIGlzIHRoZSBydW4gdGhhdCBhcnRpZmFjdHMgd2lsbCBiZSBkb3dubG9hZGVkIGZyb21cbiAgICpcbiAgICogQGRlZmF1bHQgLSAke3sgZ2l0aHViLnJ1bl9pZCB9fVxuICAgKi9cbiAgcmVhZG9ubHkgcnVuSWQ/OiBzdHJpbmc7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgRG93bmxvYWRBcnRpZmFjdE9wdGlvbnMgZXh0ZW5kcyBKb2JTdGVwQ29uZmlndXJhdGlvbiB7XG4gIC8qKlxuICAgKiBPcHRpb25zIGZvciBgZG93bmxvYWQtYXJ0aWZhY3RgLlxuICAgKi9cbiAgcmVhZG9ubHkgd2l0aDogRG93bmxvYWRBcnRpZmFjdFdpdGg7XG59XG4iXX0=