diff --git a/.claude/rules/1-04-vba-style.md b/.claude/rules/1-04-vba-style.md new file mode 100644 index 0000000..afcd991 --- /dev/null +++ b/.claude/rules/1-04-vba-style.md @@ -0,0 +1,43 @@ +--- +paths: + - "**/*.{bas,cls,frm,form,rep,report}" +--- + + + +## VBA coding style +Applies to standard modules (`.bas`), class modules and code-behind (`.cls`), and form/report files +(`.form`/`.report` from the msaccess-vcs-addin, `.frm`/`.rep` from the ACLib Import Wizard). + +### Naming +- Access objects with a one-letter type prefix: tables `t...` (`tCustomers`), forms `f...` (`fCustomer`). +- Controls with a type prefix (`txt`, `lbl`, `chk`, `cmd`, ...), e.g. `txtCustomerNo`, `cmdSave`. +- VBA variables, constants, procedures and classes with meaningful names **without** type prefix (`ErrNumber`, `SaveRecord`, `CustomerRepository`). +- Standard modules (`.bas`) with the prefix `mod` (`modDaoTools`, `modProjectRules`). Class modules get no prefix. + Exceptions without prefix only where a module is used like a namespace (`AppConfig.Value`) or a special case such as `_config` applies; decide per project in the context of its use and record it in the project facts. + Often a better solution is a self-instancing class (`VB_PredeclaredId = True`, used as `AppConfig.Value`): it needs no prefix and its procedures cannot be called without the class name. + Use its default instance only for stateless helpers, factories or read-only configuration; logic classes do not reach for it but receive the values they need (no hidden global state, see the architecture rules). + Keep the existing names of imported third-party code (e.g. ACLib modules). +- Procedures: verb + object (`LoadCustomer`, `CalculateTotal`); functions that return a Boolean read as a question (`IsValid`, `HasItems`). +- Interfaces start with `I` (`ICustomerRepository`); implementing classes are named after what they do (`CustomerRepository`, `CustomerRepositoryFake`). +- Test classes are named `Tests` (see AccUnit rules). +- Constants in `PascalCase` (no all-caps, no `c`/`k` prefix); enum names singular, members prefixed with the enum name where this avoids clashes. + +### Layout +- Indent with 4 spaces (no tabs); keep the indentation style of an existing file. +- One statement per line; avoid line continuations unless they clearly help readability; lines at most ~100 characters. +- Declare variables close to their first use, one per line, always with an explicit type. No `Variant` unless required. +- Use `ByVal` for parameters unless the procedure has to change the caller's value; declare scope (`Public`/`Friend`/`Private`) explicitly. +- Module order: `Option` lines, constants and enums, private members, events, public properties, public procedures, private procedures. +- Standard modules that must not be accessed from outside the project get `Option Private Module` (after `Option Explicit`). + Use it for internal helpers, so that their `Public` procedures stay out of other VBA projects, the macro list and `Application.Run` calls from outside. + Do not set it on modules whose procedures are called from queries, form/report properties or macros: such calls may stop working, so check the callers first. + Class modules have no `Option Private Module` effect; limit what they expose with `Friend` and `Private` members. +- Place objects in the `@Folder` structure used by the project (see `vcs-agent-docs`); do not invent a new structure. + +### Comments +- Comments explain why, not what. No commented-out code. +- A public procedure whose name and parameters do not explain it fully gets a short comment line above it. + +### Files +- Keep the encoding and line endings of existing files (usually ANSI/Windows-1252 or UTF-8 with BOM, CRLF); take care with umlauts. diff --git a/.claude/rules/1-05-vba-architecture.md b/.claude/rules/1-05-vba-architecture.md new file mode 100644 index 0000000..a63eed3 --- /dev/null +++ b/.claude/rules/1-05-vba-architecture.md @@ -0,0 +1,24 @@ +--- +paths: + - "**/*.{bas,cls,frm,form,rep,report}" +--- + + + +## VBA architecture (SRP, layers, testability) +- **Single responsibility is the main rule.** + - A procedure does one thing; split long procedures into named steps, a reader should grasp it without scrolling. + - A class or module has one reason to change. When a class needs "and" to describe it, split it. + - Treat length as a warning signal, not as a hard limit: a procedure over ~30 lines or a class over ~300 lines is a reason to check for several responsibilities. +- **Layers** (dependencies point downwards only): + 1. UI: forms and reports. Event procedures contain no logic; they call well-named procedures that only read inputs, delegate and show results. + 2. Logic: classes and standard modules with the rules of the application. No reference to forms (`Forms!...`, `Me`), no `MsgBox`, no direct database access (`CurrentDb`, `DoCmd`). + 3. Data access: own classes or modules (repository style) that read and write data, built on DAO/ADODB or the ACLib data modules. +- Apply the layers to new code with real application logic; forms that only show and edit data need no extra layers (YAGNI). +- **Testable by design:** logic receives what it needs through parameters or properties (dependency injection), not by reaching for globals or the database. + Describe collaborators with an interface (`Implements`) when a fake is useful in tests. Logic classes keep no hidden global state. +- If the project uses AccUnit, new logic comes with tests (see the AccUnit rules). +- Put logic into classes or modules, not into form modules; a form module only wires the UI to the logic. +- Return results and raise errors; the UI layer decides how to show them. +- **Reuse before writing new code:** check the AccessCodeLib modules first, then existing project modules; write new code only if neither fits. +- Do not restructure existing code unasked. In code you touch for another reason, apply these rules to the new and changed parts; report further findings instead of fixing them. diff --git a/.gitignore b/.gitignore index c6f3b71..e73c1a7 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,8 @@ /*.accdb +*.laccdb +*.env +logs/ +test-results/ +.env.* +!.env*.example +*.zip diff --git a/AGENTS.md b/AGENTS.md new file mode 100644 index 0000000..4a87823 --- /dev/null +++ b/AGENTS.md @@ -0,0 +1,231 @@ + + +# AGENTS.md + +Instructions for AI coding agents (Claude Code, GitHub Copilot). Project-specific rules take precedence over general ones. + +## Language +- Reply in the language the user writes in. If unclear, use the Windows display language (`Get-UICulture`). +- Code, identifiers, code comments, commit messages and branch names are always in English. + +## Way of working +- Before changing files, propose a short plan and wait for confirmation. Exceptions: read-only access, analysis, and temporary files outside the project. +- Ask when requirements are unclear instead of making assumptions. With several possible solutions, give a recommendation with reasons. +- Keep changes small and traceable. No unrequested refactoring of existing code. Report findings outside the task, do not fix them. +- Follow the existing style and conventions of the project. +- Never delete, overwrite, commit or push without explicit approval. An approval applies only to that action, not to later ones. +- After changes, summarize briefly: what changed, what was tested, what is open. + +## Git +- Commit messages in imperative mood, subject line max. ~72 characters. +- No force push, no rewriting of already pushed history. +- No attribution to AI tools: no `Co-Authored-By: ...` trailer in commit messages, no "Generated with ..." line in pull request descriptions. + +## Files and environment +- Keep the encoding and line endings (CRLF) of existing files. +- In PowerShell 5.1 always specify the encoding explicitly when writing files. +- Windows 11. Take the regional settings (decimal separator, date format) into account when parsing and formatting. For persistence and data exchange use locale-independent formats. + +## Clean code (all languages) +Principles of Clean Code / Clean Code Developers, as rules for everyday work: + +### Structure +- **Single responsibility (SRP):** each procedure/method does exactly one thing, each class/module has one reason to change. Split long procedures into named steps. +- **Separation of concerns:** keep logic, UI and data access apart. Event handlers contain no logic; they only call well-named procedures. +- **Keep code testable:** logic does not depend on UI or on concrete data access; dependencies are passed in. + +### Simplicity +- **KISS:** choose the simplest solution that works and can be read at once. +- **YAGNI:** build only what is needed now; no speculative options, parameters or layers. +- **DRY:** no duplicated logic - extract shared code instead of copying it. Do not abstract before the duplication is real. +- **Principle of least astonishment:** names, behavior and side effects match what a reader expects. + +### Readability +- Meaningful, intention-revealing names; no abbreviations that need explanation (established prefixes of the project's style guide are allowed). +- No magic numbers or strings: use named constants or enums. +- Comments explain why, not what. Remove commented-out and dead code in the parts you change; report it elsewhere. +- Tell, don't ask; avoid long call chains (law of Demeter). + +### Safety net and discipline +- **Errors:** never swallow errors silently. Handle an error where it can be handled, otherwise pass it on. +- **Tests:** logic is covered by automated tests; refactor only with tests as safety net. +- **Boy scout rule within the task:** leave code you touch a little cleaner. Findings outside the task are reported, not fixed (no unrequested rewrites). +- Work in small, understandable steps. + +## Secure coding (all languages) +- Treat every input as untrusted (user input, form fields, files, command-line arguments, database content, results of other systems). Validate type, length, range and format; prefer allow-lists over block-lists. +- Prevent injection: never concatenate unchecked values or identifiers into SQL, filter or expression strings, shell commands or file paths. + Use parameter queries; where dynamic SQL is unavoidable, use the safe building blocks of the platform or project. +- No secrets in code, repository, logs or test data (passwords, tokens, connection strings with credentials). Keep them in `.env.local` or the secret store of the environment; keep such files out of version control. +- Error messages shown to users contain no internal details (SQL text, paths, stack information). Details go to the log. +- Least privilege: request only the permissions and access that are needed; do not widen them to make a problem disappear. +- Handle files and paths defensively: build paths from validated parts, check that the target is where you expect it, never delete or overwrite based on unchecked input. +- Do not invent your own cryptography, hashing or authentication; use proven platform or library functions. +- Use third-party and library code only from known sources; report outdated versions instead of updating them unasked. +- Do not execute strings as code (`Eval`, `Application.Run` with user input, `Shell`, `Invoke-Expression` and similar) unless the content is fully under your control. + +## Microsoft Access / VBA +- `Option Compare Text` and `Option Explicit` in every module, test classes included. `Option Compare Text` is set explicitly so that a changed database collation can never switch string comparison or sorting to binary or another order. Declare all variables with explicit types. +- 64-bit: API declarations with `PtrSafe`, handles/pointers as `LongPtr`. +- Naming, layout and comments: see the VBA coding style. Structure (SRP, layers, event procedures without logic): see the VBA architecture rules. + Event procedures (`Form_Load`, `cmd..._Click`, `WithEvents` handlers) only call well-named procedures (e.g. `Form_Load` -> `InitItemsForm`, `InitFilterManager`). +- Security basics (input validation, no injection, no secrets): see the secure coding rules. In Access in particular, do not pass unchecked values to `DoCmd.RunSQL`, `Eval`, `Application.Run`, `Shell` or pass-through queries. + +### Forms +- Use `Me.` for methods and properties of the form, controls included (`Me.Requery`, `Me.Dirty`, `Me.txtCustomerNo`). +- Use `Me!` only for fields of the record source (`Access.AccessField`): `Me!`, e.g. `Me!CustomerID`. + The `Me.` property is generated when the record source is set, but it can get lost on a reimport with the msaccess-vcs-addin or after other changes, which breaks compilation. + `Me!` resolves the field at runtime (late binding). + +### Error handling +Follow the project's own rule if there is one (e.g. a global handler such as vbWatchdog). Otherwise: +- No blanket error handling that shows the error in a `MsgBox` and then continues. +- Add local error handling only where cleanup is needed on failure (open recordsets, transactions, object references): + save `Err.Number`, `Err.Source`, `Err.Description`, clean up, roll back transactions, then re-raise with `Err.Raise` using the saved values. + No `MsgBox`, do not swallow the error. +- Handle expected errors specifically and locally (e.g. error 2101 when saving is cancelled, checked against a named constant); pass all others on. + +### Data access +- Use DAO or ADODB. Close recordsets and objects and set them to `Nothing`. +- Prefer parameter queries / `QueryDef` parameters over concatenated SQL. +- Use dynamic SQL only when necessary and always protect it against SQL injection (never concatenate unchecked values or identifiers into SQL). +- Dates and numbers in SQL strings must be locale independent: `#yyyy-mm-dd#`, decimal point. +- Data in linked SQL Server tables/views may be read only in approved databases (see the SQL Server rules); local configuration tables are not affected. + +### Working with the database file +- `.accdb`/`.mdb` are binary: work only with exported text files. +- Exported VBA files are usually ANSI (Windows-1252) or UTF-8 with BOM: keep the encoding (umlauts!). +- Never work with more than one Access instance on the same `.accdb`/`.mdb` at the same time (MCP server, automation, or the user's own Access window). + Before switching, release the current instance and verify that no `MSACCESS.EXE` still holds the file open (`.laccdb`); ask the user to close Access if necessary. + Exception: if the user has opened the file in Access, you may use exactly that running instance, but only after asking and with explicit approval (valid for the current session). + Never open a further instance on that file (no tool that starts Access itself); if a tool cannot attach to the existing instance, do not use it. Never close the user's instance. + +## Access project layout and workflow (msaccess-vcs-addin) +MS Access project (Microsoft 365, 64-bit). Check the project for whether front end and tables are in one file or split. + +- `.accdb`: binary, never edit directly, do not version. +- `.accdb.src/`: source export by the msaccess-vcs-addin. Work here. + - `modules/` (`.bas`, `.cls`), `forms/`, `reports/`, `queries/` (`.sql` + metadata), `tbldefs/`. + - The actual folder structure of the export takes precedence over this overview. +- `.accdb.src/AGENTS.md` and `vcs-agent-docs/` are **generated by the add-in and overwritten on every export**: read them (encoding, line endings, `@Folder` placement, file types), but never edit them. + +### Workflow +1. Before editing: run **Export Source Files** in Access via the add-in so the source is current. If unsure, ask whether it was exported. +2. Edit only the files in the source folder where possible; otherwise use the MCP server `access`. +3. Back into the database: add-in **Build From Source** (or merge build). +4. Then compile in Access (Debug -> Compile) and test. +- Automate Access only through the MCP servers below, not with your own COM scripts. +- Before driving Access through the MCP servers, scripts or UI Automation, read `C:\dev\AgentsConfig\docs\access-automation.md` + (experience and recipes; the rules here take precedence). Add new insights to it as they come up. + +### MCP server msaccess-vcs-mcp +- Registered as MCP server in the project's `.mcp.json` or in the user scope; target database via `ACCESS_VCS_DATABASE` in `.env` (personal overrides in `.env.local`). +- Read-only tools (`vcs_export_database`, `vcs_export_object`, `vcs_list_objects`, `vcs_diff_database`, `vcs_execute_sql`, `vcs_check_vba_compiled`, `vcs_get_log`) may be used without asking. +- Writing tools (`vcs_import_object(s)`, `vcs_rebuild_database`, `vcs_compile_vba`, `vcs_set_option`) only after approval. +- Typical flow: export -> edit source files -> `vcs_import_object` -> `vcs_compile_vba` -> check `vcs_get_log` -> `vcs_export_object`. +- An approval for an import covers the compile, log check and export that follow in this flow; anything beyond it needs a new approval. +- If compilation fails, make no further changes: ask the user to run Debug -> Compile in the VBE and to report the affected line. +- Change add-in metadata/JSON files only when necessary and with a note. +- `McpAllowRunVBA` stays off; `vcs_call_vba` and `vcs_run_vba` are not used. + +### MCP server access (MCP-Access) +- Registered as MCP server in the project's `.mcp.json` or in the user scope; source: https://github.com/unmateria/MCP-Access, locally at `C:\dev\tools\MCP-Access`. +- For creating and designing objects (forms, reports, controls), e.g. `access_build_form`, `access_set_multiple_controls`. + Do not write VBA code with it (`access_set_code`, `access_vbe_*`); code is edited in the `.cls`/`.bas` files (see division of work). +- Code execution (`MCP_ACCESS_ALLOW_CODE_EXEC`) stays disabled. + +### MCP server aclib-import +- Imports and updates ACLib modules (see the ACLib rules, skill `/aclib-import`). +- It attaches to a running Access instance on the database, otherwise it starts its own hidden instance and closes it after the call. + The single-instance rule applies: release the other servers first. +- After an import, export the imported modules with `vcs_export_object` before editing them in the source folder. + +### Division of work +- Before every switch between the servers (`access`, `msaccess-vcs-mcp`, `aclib-import`) run `access_close` or `vcs_end_session` (single-instance rule). +- Layout: structural changes (new forms, adding/removing controls) with the server `access`; then immediately `access_close` and `vcs_export_object`. + Small property changes (caption, position, format) may be made directly in the `.form`/`.report` file; mention them in the summary. +- Code: edit only in the `.cls`/`.bas` files, then `vcs_import_object` -> `vcs_compile_vba` -> check log -> `vcs_export_object`. +- Never import code while a layout change in the database has not yet been exported (the import would overwrite the layout). +- Version the source folder; put `*.accdb`, `*.laccdb` and backups into `.gitignore`. Commit after each completed step, only with approval. + +## AccessCodeLib (ACLib) +- ACLib provides reusable, unit-tested and widely used code modules for many areas (dynamic SQL, filters, string handling, ...). + Prefer an ACLib module over newly generated code: it is verified and proven in use. + Before writing your own helper code, check whether a module already provides the functionality. +- Find modules in the ACLib module catalog (`_codelib/catalog/catalog.md`, in the local ACLib repository or at + https://github.com/AccessCodeLib/AccessCodeLib). Never guess module names or paths; if no catalog is available, ask the user. +- For dynamic SQL, use the ACLib data modules (e.g. SqlTools, FilterStringBuilder) to protect it against SQL injection + instead of building SQL strings by hand. +- Import and update ACLib modules with the skill `/aclib-import` (aclib-import MCP server): show the plan first, + import only after approval, then compile. Do not copy module code manually. + Without the skill or the MCP server, ask the user to import the module with the ACLib Import Wizard. +- ACLib modules may be edited in the project when needed. Keep such changes small and tell the user about them: they have to be + sent back to the CodeLib (export with the ACLib Import Wizard into the CodeLib), otherwise they stay local and a later + import with `overwrite` replaces them. Do not export into the CodeLib yourself. +- Do not import test or example modules unless the user asks (tests need the AccUnit environment). + +## VBA coding style +Applies to standard modules (`.bas`), class modules and code-behind (`.cls`), and form/report files +(`.form`/`.report` from the msaccess-vcs-addin, `.frm`/`.rep` from the ACLib Import Wizard). + +### Naming +- Access objects with a one-letter type prefix: tables `t...` (`tCustomers`), forms `f...` (`fCustomer`). +- Controls with a type prefix (`txt`, `lbl`, `chk`, `cmd`, ...), e.g. `txtCustomerNo`, `cmdSave`. +- VBA variables, constants, procedures and classes with meaningful names **without** type prefix (`ErrNumber`, `SaveRecord`, `CustomerRepository`). +- Standard modules (`.bas`) with the prefix `mod` (`modDaoTools`, `modProjectRules`). Class modules get no prefix. + Exceptions without prefix only where a module is used like a namespace (`AppConfig.Value`) or a special case such as `_config` applies; decide per project in the context of its use and record it in the project facts. + Often a better solution is a self-instancing class (`VB_PredeclaredId = True`, used as `AppConfig.Value`): it needs no prefix and its procedures cannot be called without the class name. + Use its default instance only for stateless helpers, factories or read-only configuration; logic classes do not reach for it but receive the values they need (no hidden global state, see the architecture rules). + Keep the existing names of imported third-party code (e.g. ACLib modules). +- Procedures: verb + object (`LoadCustomer`, `CalculateTotal`); functions that return a Boolean read as a question (`IsValid`, `HasItems`). +- Interfaces start with `I` (`ICustomerRepository`); implementing classes are named after what they do (`CustomerRepository`, `CustomerRepositoryFake`). +- Test classes are named `Tests` (see AccUnit rules). +- Constants in `PascalCase` (no all-caps, no `c`/`k` prefix); enum names singular, members prefixed with the enum name where this avoids clashes. + +### Layout +- Indent with 4 spaces (no tabs); keep the indentation style of an existing file. +- One statement per line; avoid line continuations unless they clearly help readability; lines at most ~100 characters. +- Declare variables close to their first use, one per line, always with an explicit type. No `Variant` unless required. +- Use `ByVal` for parameters unless the procedure has to change the caller's value; declare scope (`Public`/`Friend`/`Private`) explicitly. +- Module order: `Option` lines, constants and enums, private members, events, public properties, public procedures, private procedures. +- Standard modules that must not be accessed from outside the project get `Option Private Module` (after `Option Explicit`). + Use it for internal helpers, so that their `Public` procedures stay out of other VBA projects, the macro list and `Application.Run` calls from outside. + Do not set it on modules whose procedures are called from queries, form/report properties or macros: such calls may stop working, so check the callers first. + Class modules have no `Option Private Module` effect; limit what they expose with `Friend` and `Private` members. +- Place objects in the `@Folder` structure used by the project (see `vcs-agent-docs`); do not invent a new structure. + +### Comments +- Comments explain why, not what. No commented-out code. +- A public procedure whose name and parameters do not explain it fully gets a short comment line above it. + +### Files +- Keep the encoding and line endings of existing files (usually ANSI/Windows-1252 or UTF-8 with BOM, CRLF); take care with umlauts. + +## VBA architecture (SRP, layers, testability) +- **Single responsibility is the main rule.** + - A procedure does one thing; split long procedures into named steps, a reader should grasp it without scrolling. + - A class or module has one reason to change. When a class needs "and" to describe it, split it. + - Treat length as a warning signal, not as a hard limit: a procedure over ~30 lines or a class over ~300 lines is a reason to check for several responsibilities. +- **Layers** (dependencies point downwards only): + 1. UI: forms and reports. Event procedures contain no logic; they call well-named procedures that only read inputs, delegate and show results. + 2. Logic: classes and standard modules with the rules of the application. No reference to forms (`Forms!...`, `Me`), no `MsgBox`, no direct database access (`CurrentDb`, `DoCmd`). + 3. Data access: own classes or modules (repository style) that read and write data, built on DAO/ADODB or the ACLib data modules. +- Apply the layers to new code with real application logic; forms that only show and edit data need no extra layers (YAGNI). +- **Testable by design:** logic receives what it needs through parameters or properties (dependency injection), not by reaching for globals or the database. + Describe collaborators with an interface (`Implements`) when a fake is useful in tests. Logic classes keep no hidden global state. +- If the project uses AccUnit, new logic comes with tests (see the AccUnit rules). +- Put logic into classes or modules, not into form modules; a form module only wires the UI to the logic. +- Return results and raise errors; the UI layer decides how to show them. +- **Reuse before writing new code:** check the AccessCodeLib modules first, then existing project modules; write new code only if neither fits. +- Do not restructure existing code unasked. In code you touch for another reason, apply these rules to the new and changed parts; report further findings instead of fixing them. + +## Project specifics +- Access add-in "DBMS Connection Wizard": configures a DBMS connection and imports the + ACLib DbConnection framework into the target database. +- `source\` (msaccess-vcs-addin export) is the single source of truth; binary files + (`.accdb`, `.accda`) are not edited as source and are not committed. +- The add-in file is built from `source\` with msaccess-vcs-build + (GitHub action or local `Build.ps1`); do not run a build without approval. +- `doc\` holds the interface documentation generated with Natural Docs (`doc\GenerateDoc.cmd`); + do not edit generated output by hand. +- `.accdb`/`.accda` files in the root (e.g. `Test.accdb`, `TestAddIn.accda`) are local test or build files. diff --git a/AGENTS.parts.txt b/AGENTS.parts.txt new file mode 100644 index 0000000..c3534c3 --- /dev/null +++ b/AGENTS.parts.txt @@ -0,0 +1,8 @@ +0-01-base.md +0-02-clean-code.md +0-03-secure-coding.md +1-01-access-vba.md +1-02-access-vcs.md +1-03-access-aclib.md +1-04-vba-style.md +1-05-vba-architecture.md diff --git a/AGENTS.project.md b/AGENTS.project.md new file mode 100644 index 0000000..54c3fe5 --- /dev/null +++ b/AGENTS.project.md @@ -0,0 +1,10 @@ +## Project specifics +- Access add-in "DBMS Connection Wizard": configures a DBMS connection and imports the + ACLib DbConnection framework into the target database. +- `source\` (msaccess-vcs-addin export) is the single source of truth; binary files + (`.accdb`, `.accda`) are not edited as source and are not committed. +- The add-in file is built from `source\` with msaccess-vcs-build + (GitHub action or local `Build.ps1`); do not run a build without approval. +- `doc\` holds the interface documentation generated with Natural Docs (`doc\GenerateDoc.cmd`); + do not edit generated output by hand. +- `.accdb`/`.accda` files in the root (e.g. `Test.accdb`, `TestAddIn.accda`) are local test or build files. diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..f2c54ce --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,176 @@ + + +# AGENTS.md + +Instructions for AI coding agents (Claude Code, GitHub Copilot). Project-specific rules take precedence over general ones. + +## Language +- Reply in the language the user writes in. If unclear, use the Windows display language (`Get-UICulture`). +- Code, identifiers, code comments, commit messages and branch names are always in English. + +## Way of working +- Before changing files, propose a short plan and wait for confirmation. Exceptions: read-only access, analysis, and temporary files outside the project. +- Ask when requirements are unclear instead of making assumptions. With several possible solutions, give a recommendation with reasons. +- Keep changes small and traceable. No unrequested refactoring of existing code. Report findings outside the task, do not fix them. +- Follow the existing style and conventions of the project. +- Never delete, overwrite, commit or push without explicit approval. An approval applies only to that action, not to later ones. +- After changes, summarize briefly: what changed, what was tested, what is open. + +## Git +- Commit messages in imperative mood, subject line max. ~72 characters. +- No force push, no rewriting of already pushed history. +- No attribution to AI tools: no `Co-Authored-By: ...` trailer in commit messages, no "Generated with ..." line in pull request descriptions. + +## Files and environment +- Keep the encoding and line endings (CRLF) of existing files. +- In PowerShell 5.1 always specify the encoding explicitly when writing files. +- Windows 11. Take the regional settings (decimal separator, date format) into account when parsing and formatting. For persistence and data exchange use locale-independent formats. + +## Clean code (all languages) +Principles of Clean Code / Clean Code Developers, as rules for everyday work: + +### Structure +- **Single responsibility (SRP):** each procedure/method does exactly one thing, each class/module has one reason to change. Split long procedures into named steps. +- **Separation of concerns:** keep logic, UI and data access apart. Event handlers contain no logic; they only call well-named procedures. +- **Keep code testable:** logic does not depend on UI or on concrete data access; dependencies are passed in. + +### Simplicity +- **KISS:** choose the simplest solution that works and can be read at once. +- **YAGNI:** build only what is needed now; no speculative options, parameters or layers. +- **DRY:** no duplicated logic - extract shared code instead of copying it. Do not abstract before the duplication is real. +- **Principle of least astonishment:** names, behavior and side effects match what a reader expects. + +### Readability +- Meaningful, intention-revealing names; no abbreviations that need explanation (established prefixes of the project's style guide are allowed). +- No magic numbers or strings: use named constants or enums. +- Comments explain why, not what. Remove commented-out and dead code in the parts you change; report it elsewhere. +- Tell, don't ask; avoid long call chains (law of Demeter). + +### Safety net and discipline +- **Errors:** never swallow errors silently. Handle an error where it can be handled, otherwise pass it on. +- **Tests:** logic is covered by automated tests; refactor only with tests as safety net. +- **Boy scout rule within the task:** leave code you touch a little cleaner. Findings outside the task are reported, not fixed (no unrequested rewrites). +- Work in small, understandable steps. + +## Secure coding (all languages) +- Treat every input as untrusted (user input, form fields, files, command-line arguments, database content, results of other systems). Validate type, length, range and format; prefer allow-lists over block-lists. +- Prevent injection: never concatenate unchecked values or identifiers into SQL, filter or expression strings, shell commands or file paths. + Use parameter queries; where dynamic SQL is unavoidable, use the safe building blocks of the platform or project. +- No secrets in code, repository, logs or test data (passwords, tokens, connection strings with credentials). Keep them in `.env.local` or the secret store of the environment; keep such files out of version control. +- Error messages shown to users contain no internal details (SQL text, paths, stack information). Details go to the log. +- Least privilege: request only the permissions and access that are needed; do not widen them to make a problem disappear. +- Handle files and paths defensively: build paths from validated parts, check that the target is where you expect it, never delete or overwrite based on unchecked input. +- Do not invent your own cryptography, hashing or authentication; use proven platform or library functions. +- Use third-party and library code only from known sources; report outdated versions instead of updating them unasked. +- Do not execute strings as code (`Eval`, `Application.Run` with user input, `Shell`, `Invoke-Expression` and similar) unless the content is fully under your control. + +## Microsoft Access / VBA +- `Option Compare Text` and `Option Explicit` in every module, test classes included. `Option Compare Text` is set explicitly so that a changed database collation can never switch string comparison or sorting to binary or another order. Declare all variables with explicit types. +- 64-bit: API declarations with `PtrSafe`, handles/pointers as `LongPtr`. +- Naming, layout and comments: see the VBA coding style. Structure (SRP, layers, event procedures without logic): see the VBA architecture rules. + Event procedures (`Form_Load`, `cmd..._Click`, `WithEvents` handlers) only call well-named procedures (e.g. `Form_Load` -> `InitItemsForm`, `InitFilterManager`). +- Security basics (input validation, no injection, no secrets): see the secure coding rules. In Access in particular, do not pass unchecked values to `DoCmd.RunSQL`, `Eval`, `Application.Run`, `Shell` or pass-through queries. + +### Forms +- Use `Me.` for methods and properties of the form, controls included (`Me.Requery`, `Me.Dirty`, `Me.txtCustomerNo`). +- Use `Me!` only for fields of the record source (`Access.AccessField`): `Me!`, e.g. `Me!CustomerID`. + The `Me.` property is generated when the record source is set, but it can get lost on a reimport with the msaccess-vcs-addin or after other changes, which breaks compilation. + `Me!` resolves the field at runtime (late binding). + +### Error handling +Follow the project's own rule if there is one (e.g. a global handler such as vbWatchdog). Otherwise: +- No blanket error handling that shows the error in a `MsgBox` and then continues. +- Add local error handling only where cleanup is needed on failure (open recordsets, transactions, object references): + save `Err.Number`, `Err.Source`, `Err.Description`, clean up, roll back transactions, then re-raise with `Err.Raise` using the saved values. + No `MsgBox`, do not swallow the error. +- Handle expected errors specifically and locally (e.g. error 2101 when saving is cancelled, checked against a named constant); pass all others on. + +### Data access +- Use DAO or ADODB. Close recordsets and objects and set them to `Nothing`. +- Prefer parameter queries / `QueryDef` parameters over concatenated SQL. +- Use dynamic SQL only when necessary and always protect it against SQL injection (never concatenate unchecked values or identifiers into SQL). +- Dates and numbers in SQL strings must be locale independent: `#yyyy-mm-dd#`, decimal point. +- Data in linked SQL Server tables/views may be read only in approved databases (see the SQL Server rules); local configuration tables are not affected. + +### Working with the database file +- `.accdb`/`.mdb` are binary: work only with exported text files. +- Exported VBA files are usually ANSI (Windows-1252) or UTF-8 with BOM: keep the encoding (umlauts!). +- Never work with more than one Access instance on the same `.accdb`/`.mdb` at the same time (MCP server, automation, or the user's own Access window). + Before switching, release the current instance and verify that no `MSACCESS.EXE` still holds the file open (`.laccdb`); ask the user to close Access if necessary. + Exception: if the user has opened the file in Access, you may use exactly that running instance, but only after asking and with explicit approval (valid for the current session). + Never open a further instance on that file (no tool that starts Access itself); if a tool cannot attach to the existing instance, do not use it. Never close the user's instance. + +## Access project layout and workflow (msaccess-vcs-addin) +MS Access project (Microsoft 365, 64-bit). Check the project for whether front end and tables are in one file or split. + +- `.accdb`: binary, never edit directly, do not version. +- `.accdb.src/`: source export by the msaccess-vcs-addin. Work here. + - `modules/` (`.bas`, `.cls`), `forms/`, `reports/`, `queries/` (`.sql` + metadata), `tbldefs/`. + - The actual folder structure of the export takes precedence over this overview. +- `.accdb.src/AGENTS.md` and `vcs-agent-docs/` are **generated by the add-in and overwritten on every export**: read them (encoding, line endings, `@Folder` placement, file types), but never edit them. + +### Workflow +1. Before editing: run **Export Source Files** in Access via the add-in so the source is current. If unsure, ask whether it was exported. +2. Edit only the files in the source folder where possible; otherwise use the MCP server `access`. +3. Back into the database: add-in **Build From Source** (or merge build). +4. Then compile in Access (Debug -> Compile) and test. +- Automate Access only through the MCP servers below, not with your own COM scripts. +- Before driving Access through the MCP servers, scripts or UI Automation, read `C:\dev\AgentsConfig\docs\access-automation.md` + (experience and recipes; the rules here take precedence). Add new insights to it as they come up. + +### MCP server msaccess-vcs-mcp +- Registered as MCP server in the project's `.mcp.json` or in the user scope; target database via `ACCESS_VCS_DATABASE` in `.env` (personal overrides in `.env.local`). +- Read-only tools (`vcs_export_database`, `vcs_export_object`, `vcs_list_objects`, `vcs_diff_database`, `vcs_execute_sql`, `vcs_check_vba_compiled`, `vcs_get_log`) may be used without asking. +- Writing tools (`vcs_import_object(s)`, `vcs_rebuild_database`, `vcs_compile_vba`, `vcs_set_option`) only after approval. +- Typical flow: export -> edit source files -> `vcs_import_object` -> `vcs_compile_vba` -> check `vcs_get_log` -> `vcs_export_object`. +- An approval for an import covers the compile, log check and export that follow in this flow; anything beyond it needs a new approval. +- If compilation fails, make no further changes: ask the user to run Debug -> Compile in the VBE and to report the affected line. +- Change add-in metadata/JSON files only when necessary and with a note. +- `McpAllowRunVBA` stays off; `vcs_call_vba` and `vcs_run_vba` are not used. + +### MCP server access (MCP-Access) +- Registered as MCP server in the project's `.mcp.json` or in the user scope; source: https://github.com/unmateria/MCP-Access, locally at `C:\dev\tools\MCP-Access`. +- For creating and designing objects (forms, reports, controls), e.g. `access_build_form`, `access_set_multiple_controls`. + Do not write VBA code with it (`access_set_code`, `access_vbe_*`); code is edited in the `.cls`/`.bas` files (see division of work). +- Code execution (`MCP_ACCESS_ALLOW_CODE_EXEC`) stays disabled. + +### MCP server aclib-import +- Imports and updates ACLib modules (see the ACLib rules, skill `/aclib-import`). +- It attaches to a running Access instance on the database, otherwise it starts its own hidden instance and closes it after the call. + The single-instance rule applies: release the other servers first. +- After an import, export the imported modules with `vcs_export_object` before editing them in the source folder. + +### Division of work +- Before every switch between the servers (`access`, `msaccess-vcs-mcp`, `aclib-import`) run `access_close` or `vcs_end_session` (single-instance rule). +- Layout: structural changes (new forms, adding/removing controls) with the server `access`; then immediately `access_close` and `vcs_export_object`. + Small property changes (caption, position, format) may be made directly in the `.form`/`.report` file; mention them in the summary. +- Code: edit only in the `.cls`/`.bas` files, then `vcs_import_object` -> `vcs_compile_vba` -> check log -> `vcs_export_object`. +- Never import code while a layout change in the database has not yet been exported (the import would overwrite the layout). +- Version the source folder; put `*.accdb`, `*.laccdb` and backups into `.gitignore`. Commit after each completed step, only with approval. + +## AccessCodeLib (ACLib) +- ACLib provides reusable, unit-tested and widely used code modules for many areas (dynamic SQL, filters, string handling, ...). + Prefer an ACLib module over newly generated code: it is verified and proven in use. + Before writing your own helper code, check whether a module already provides the functionality. +- Find modules in the ACLib module catalog (`_codelib/catalog/catalog.md`, in the local ACLib repository or at + https://github.com/AccessCodeLib/AccessCodeLib). Never guess module names or paths; if no catalog is available, ask the user. +- For dynamic SQL, use the ACLib data modules (e.g. SqlTools, FilterStringBuilder) to protect it against SQL injection + instead of building SQL strings by hand. +- Import and update ACLib modules with the skill `/aclib-import` (aclib-import MCP server): show the plan first, + import only after approval, then compile. Do not copy module code manually. + Without the skill or the MCP server, ask the user to import the module with the ACLib Import Wizard. +- ACLib modules may be edited in the project when needed. Keep such changes small and tell the user about them: they have to be + sent back to the CodeLib (export with the ACLib Import Wizard into the CodeLib), otherwise they stay local and a later + import with `overwrite` replaces them. Do not export into the CodeLib yourself. +- Do not import test or example modules unless the user asks (tests need the AccUnit environment). + +## Project specifics +- Access add-in "DBMS Connection Wizard": configures a DBMS connection and imports the + ACLib DbConnection framework into the target database. +- `source\` (msaccess-vcs-addin export) is the single source of truth; binary files + (`.accdb`, `.accda`) are not edited as source and are not committed. +- The add-in file is built from `source\` with msaccess-vcs-build + (GitHub action or local `Build.ps1`); do not run a build without approval. +- `doc\` holds the interface documentation generated with Natural Docs (`doc\GenerateDoc.cmd`); + do not edit generated output by hand. +- `.accdb`/`.accda` files in the root (e.g. `Test.accdb`, `TestAddIn.accda`) are local test or build files. diff --git a/access-add-in/DbmsConnectionWizard.accda b/access-add-in/DbmsConnectionWizard.accda deleted file mode 100644 index f37fed4..0000000 Binary files a/access-add-in/DbmsConnectionWizard.accda and /dev/null differ diff --git a/access-add-in/Install.vbs b/access-add-in/Install.vbs deleted file mode 100644 index a88b041..0000000 --- a/access-add-in/Install.vbs +++ /dev/null @@ -1,136 +0,0 @@ -const AddInName = "DBMS Connection Wizard" -const AddInFileName = "DbmsConnectionWizard.accda" -const MsgBoxTitle = "Install/Update ACLib-DBMS-Connection-Wizard" - -Dim AddInFileInstalled, CompletedMsg - -MsgBox "Before updating the add-in file, the add-in must not be loaded!" & chr(13) & _ - "Close all access instances for safety.", , MsgBoxTitle & ": Information" - -Select Case MsgBox("Should the add-in be used as a compiled file (accde)?" + chr(13) & _ - "(Add-In is compiled and copied to the Add-In directory.)", 3, MsgBoxTitle) - case 6 ' vbYes - AddInFileInstalled = CreateMde(GetSourceFileFullName, GetDestFileFullName) - If AddInFileInstalled Then - CompletedMsg = "Add-In was compiled and saved in '" + GetAddInLocation + "'." - Else - CompletedMsg = "Error! Compiled file was not created." - End If - case 7 ' vbNo - AddInFileInstalled = FileCopy(GetSourceFileFullName, GetDestFileFullName) - If AddInFileInstalled Then - CompletedMsg = "Add-In was saved in '" + GetAddInLocation + "'." - Else - CompletedMsg = "Error! File was not copied." - End If - case else - -End Select - -If AddInFileInstalled = True Then - RegisterAddIn GetDestFileFullName() -End If - -If CompletedMsg > "" Then - MsgBox CompletedMsg, , MsgBoxTitle -End If - - -'################################################## -' Functions - -Function GetSourceFileFullName() - GetSourceFileFullName = GetScriptLocation & AddInFileName -End Function - -Function GetDestFileFullName() - GetDestFileFullName = GetAddInLocation & AddInFileName -End Function - -Function GetScriptLocation() - With WScript - GetScriptLocation = Replace(.ScriptFullName & ":", .ScriptName & ":", "") - End With -End Function - -Function GetAddInLocation() - GetAddInLocation = GetAppDataLocation & "Microsoft\AddIns\" -End Function - -Function GetAppDataLocation() - Set wsShell = CreateObject("WScript.Shell") - GetAppDataLocation = wsShell.ExpandEnvironmentStrings("%APPDATA%") & "\" -End Function - -Function FileCopy(SourceFilePath, DestFilePath) - set fso = CreateObject("Scripting.FileSystemObject") - fso.CopyFile SourceFilePath, DestFilePath - FileCopy = True -End Function - -Function CreateMde(SourceFilePath, DestFilePath) - Set AccessApp = CreateObject("Access.Application") - AccessApp.SysCmd 603, (SourceFilePath), (DestFilePath) - CreateMde = True -End Function - - -'################################################## -' Register Menu Add-In - -Function RegisterAddIn(AddInFile) - - Dim AddInDb, AccessApp, rst, ItemValue, wsh - - Set AccessApp = CreateObject("Access.Application") - Set AddInDb = AccessApp.DBEngine.OpenDatabase(AddInFile) - - set wsh = CreateObject("WScript.Shell") - Set rst = AddInDb.OpenRecordset("select Subkey, ValName, Type, Value from USysRegInfo where ValName > '' Order By ValName", 8) 'dbOpenForwardOnly=8 - Do While Not rst.EOF - ItemValue = rst.Fields("Value").Value - If Len(ItemValue) > 0 Then - If InStr(1, ItemValue, "|ACCDIR") > 0 Then - ItemValue = AddInDb.Name - End If - End If - RegisterMenuAddInItem AccessApp, wsh, rst.Fields("Subkey").Value, rst.Fields("ValName").Value, rst.Fields("Type").Value, ItemValue - rst.MoveNext - Loop - rst.Close - - AddInDb.Close - -End Function - -Function RegisterMenuAddInItem(AccessApp, wsh, ByVal SubKey, ByVal ItemValName, ByVal RegType, ByVal ItemValue) - Dim RegName - RegName = GetRegistryPath(SubKey, AccessApp) - With wsh - If Len(ItemValName) > 0 Then - RegName = RegName & "\" & ItemValName - End If - .RegWrite RegName, ItemValue, GetRegTypeString(RegType) - End With -End Function - -Function GetRegTypeString(ByVal RegType) - Select Case RegType - Case 1 - GetRegTypeString = "REG_SZ" - Case 4 - GetRegTypeString = "REG_DWORD" - Case 0 - GetRegTypeString = vbNullString - Case Else - Err.Raise vbObjectError, "GetRegTypeString", "RegType not supported" - End Select -End Function - -Function GetRegistryPath(SubKey, AccessApp) - GetRegistryPath = Replace(SubKey, "HKEY_CURRENT_ACCESS_PROFILE", HkeyCurrentAccessProfileRegistryPath(AccessApp)) -End Function - -Function HkeyCurrentAccessProfileRegistryPath(AccessApp) - HkeyCurrentAccessProfileRegistryPath = "HKCU\SOFTWARE\Microsoft\Office\" & AccessApp.Version & "\Access" -End Function diff --git a/source/AGENTS.md b/source/AGENTS.md new file mode 100644 index 0000000..f3d3495 --- /dev/null +++ b/source/AGENTS.md @@ -0,0 +1,99 @@ +# AGENTS.md - Working With Exported Microsoft Access Source Files + +This folder is a Microsoft Access database exported to text files by the MSAccess +VCS add-in. Editing these files is how you change the database, but edits only +take effect when the add-in imports them back in Access. You cannot run or test +this code directly, and the add-in is required to build a working database from it. + +This file and everything under `vcs-agent-docs/` are generated by the add-in and +**rewritten on every export**. Keep your own project notes elsewhere. + +## Non-negotiable rules + +1. **Do not change file encoding.** Source files are UTF-8, and most are UTF-8 + *with BOM* (bytes `EF BB BF`). Re-saving without the BOM makes import fail or + silently corrupt the object. +2. **Do not change line endings.** Access `LoadFromText` requires CRLF (`\r\n`). +3. **Do not edit** `vcs-index.idx` (binary change index), `.frx` files (binary OLE + data), or `.thmx` files (ZIP archives — edit the extracted contents instead). +4. **Do not rename a file** without changing the object name stored inside it. + File names must match object names exactly. +5. **Do not alter VBA scaffolding:** `Attribute VB_Name` lines, the + `VERSION`/`BEGIN`/`END` block at the top of a `.cls`, or module-level + `Attribute VB_*` lines. The code below them is yours to edit. + +## Which file do I edit? + +| To change | Edit | Read first | +|---|---|---| +| VBA in a standard module | `modules/.bas` | `vcs-agent-docs/vba-modules.md` | +| VBA in a class module | `modules/.cls` | `vcs-agent-docs/vba-modules.md` | +| Form or report code-behind | `forms/.cls`, `reports/.cls` | `vcs-agent-docs/vba-modules.md` | +| Form or report layout | `forms/.form`, `reports/.report` | `vcs-agent-docs/forms-reports.md` | +| Conditional formatting rules | the form's or report's companion `.json` | `vcs-agent-docs/forms-reports.md` | +| Query logic | `queries/.sql` — the sole source of truth for SQL | `vcs-agent-docs/queries.md` | +| Query properties or design layout | `queries/.json` | `vcs-agent-docs/queries.md` | +| A macro | `macros/.macro` | — | +| A table definition | `tbldefs/.xml` and `.json` | — | +| A connection string | `.env` at this folder's root (gitignored) | `vcs-agent-docs/troubleshooting.md` | +| Tests | a test module under `modules/` | `vcs-agent-docs/testing.md` | + +Export format 5.0.0 renamed several object types from the overloaded `.bas` +extension: forms to `.form`, reports to `.report`, macros to `.macro`, and queries +to `.sql` plus `.json`. Older projects still use `.bas` for these, so check which +extensions are actually present. Import accepts both. + +## File placement follows the `@Folder` annotation + +The add-in reads Rubberduck-style `'@Folder("Category")` annotations and exports +components into matching subdirectories, with dots as path separators: +`'@Folder("Components.ADP")` lands in `modules/Components/ADP/`. Components with no +annotation stay at the root of `modules/`, `forms/`, or `reports/`. Import scans +subdirectories recursively. + +**The annotation decides where the file belongs on disk, not the folder you happen +to be editing in.** This is the most common way agents corrupt a project: + +- For modules, the annotation is in the `.bas` or `.cls` itself. For forms and + reports it lives in the `.cls` code-behind only — not in `.form`/`.report`, + `.json`, or `.svg`. +- Before creating or moving a component, search the **entire** `modules/`, `forms/`, + or `reports/` tree for an existing file with the same base name (for modules, + match on `Attribute VB_Name`). Edit that file in place rather than creating a + second copy elsewhere. +- If two copies exist, such as `modules/modFoo.bas` and `modules/Tests/modFoo.bas`, + build imports **both** and the last one silently wins. No error is shown. +- Build removes a misplaced duplicate automatically when exactly one copy sits in + its annotation-derived folder. Ambiguous cases are left alone with a warning. + Removing a duplicate form or report deletes its whole source group together + (`.form`/`.report` plus `.cls`, `.json`, and `.svg`). + +To relocate a component, change its `'@Folder` annotation and let the next export +move the file. + +## Where the details live + +Each of these is short. Read the matching one before making that kind of change. + +| File | Read it before | +|---|---| +| `vcs-agent-docs/vba-modules.md` | Editing any `.bas` or `.cls`, or adding a member attribute | +| `vcs-agent-docs/forms-reports.md` | Editing a `.form` or `.report` layout, or conditional formatting | +| `vcs-agent-docs/queries.md` | Editing anything in `queries/` | +| `vcs-agent-docs/testing.md` | Writing, running, or filtering tests | +| `vcs-agent-docs/troubleshooting.md` | An import, build, or compile failed, or you need the log files | + +## How changes get back into Access + +Ask the user to run a **merge build** from the add-in ribbon, which imports changed +source files into the existing database. A **full build** creates a new database +from source instead, and **export** goes the other way, writing database objects +out to these files. When a source file and its database object have both changed, +the add-in detects the conflict and prompts the user to choose which version wins. + +## More information + +- [MSAccess VCS Add-in](https://github.com/joyfullservice/msaccess-vcs-addin) +- [Wiki: Export-Import File Types](https://github.com/joyfullservice/msaccess-vcs-addin/wiki/Export-Import-File-Types) +- [Wiki: Supported Objects](https://github.com/joyfullservice/msaccess-vcs-addin/wiki/Supported-Objects) +- [Wiki: Options](https://github.com/joyfullservice/msaccess-vcs-addin/wiki/Options) diff --git a/source/codelib/user/login/LoginForm.frm b/source/codelib/user/login/LoginForm.frm deleted file mode 100644 index 9c0a0d2..0000000 Binary files a/source/codelib/user/login/LoginForm.frm and /dev/null differ diff --git a/source/dbs-properties.json b/source/dbs-properties.json new file mode 100644 index 0000000..657958d --- /dev/null +++ b/source/dbs-properties.json @@ -0,0 +1,180 @@ +{ + "Info": { + "Class": "clsDbProperty", + "Description": "Database Properties (DAO)" + }, + "Items": { + "AccessVersion": { + "Value": "09.50", + "Type": 10 + }, + "AllowBuiltInToolbars": { + "Value": true, + "Type": 1 + }, + "AllowDatasheetSchema": { + "Value": false, + "Type": 1 + }, + "AllowFullMenus": { + "Value": true, + "Type": 1 + }, + "AllowShortcutMenus": { + "Value": true, + "Type": 1 + }, + "AllowSpecialKeys": { + "Value": true, + "Type": 1 + }, + "AllowToolbarChanges": { + "Value": true, + "Type": 1 + }, + "AppTitle": { + "Value": "DBMS Connection Wizard", + "Type": 10 + }, + "Auto Compact": { + "Value": 0, + "Type": 4 + }, + "CollatingOrder": { + "Value": 66567, + "Type": 3 + }, + "Connect": { + "Value": "", + "Type": 12 + }, + "Continuous Form Navigation Keys": { + "Value": 0, + "Type": 4 + }, + "DesignMasterID": { + "Value": "", + "Type": 15 + }, + "DesignWithData": { + "Value": false, + "Type": 1 + }, + "HasOfflineLists": { + "Value": 70, + "Type": 3 + }, + "Name": { + "Value": "rel:DbmsConnectionWizard.accdb", + "Type": 12 + }, + "NavPane Category": { + "Value": 0, + "Type": 4 + }, + "NavPane Closed": { + "Value": 0, + "Type": 4 + }, + "NavPane Sort By": { + "Value": 1, + "Type": 4 + }, + "NavPane View By": { + "Value": 0, + "Type": 4 + }, + "NavPane Width": { + "Value": 679, + "Type": 4 + }, + "Picture Property Storage Format": { + "Value": 1, + "Type": 4 + }, + "ProjVer": { + "Value": 142, + "Type": 3 + }, + "QueryTimeout": { + "Value": 60, + "Type": 3 + }, + "RecordsAffected": { + "Value": 0, + "Type": 4 + }, + "ReplicaID": { + "Value": "", + "Type": 15 + }, + "Show Navigation Pane Search Bar": { + "Value": 1, + "Type": 4 + }, + "Show Values in Indexed": { + "Value": 1, + "Type": 4 + }, + "Show Values in Non-Indexed": { + "Value": 1, + "Type": 4 + }, + "Show Values in Remote": { + "Value": 0, + "Type": 4 + }, + "Show Values Limit": { + "Value": 1000, + "Type": 4 + }, + "ShowDocumentTabs": { + "Value": true, + "Type": 1 + }, + "StartUpShowDBWindow": { + "Value": true, + "Type": 1 + }, + "StartUpShowStatusBar": { + "Value": true, + "Type": 1 + }, + "Theme Resource Name": { + "Value": "1_Office Theme", + "Type": 10 + }, + "Transactions": { + "Value": true, + "Type": 1 + }, + "Updatable": { + "Value": true, + "Type": 1 + }, + "Use BigInt for linking and importing data": { + "Value": 0, + "Type": 4 + }, + "Use DateTime2 for linking and importing data": { + "Value": 0, + "Type": 4 + }, + "UseAppIconForFrmRpt": { + "Value": false, + "Type": 1 + }, + "UseMDIMode": { + "Value": 1, + "Type": 2 + }, + "Version": { + "Value": "14.0", + "Type": 12 + }, + "WebDesignMode": { + "Value": 0, + "Type": 2 + } + } +} diff --git a/source/documents.json b/source/documents.json new file mode 100644 index 0000000..dec7814 --- /dev/null +++ b/source/documents.json @@ -0,0 +1,34 @@ +{ + "Info": { + "Class": "clsDbDocument", + "Description": "Database Documents Properties (DAO)" + }, + "Items": { + "Databases": { + "SummaryInfo": { + "Author": { + "Type": 10, + "Value": "Josef Pötzl" + }, + "Comments": { + "Type": 10, + "Value": "Tabellen aus MSSQL, MySQL, Oracle oder allg. mit ODBC bzw. Jet/ACE verknüpfen" + }, + "Company": { + "Type": 10, + "Value": "http://access.joposol.com" + }, + "Title": { + "Type": 10, + "Value": "DBMS Connection Wizard" + } + }, + "UserDefined": { + "ReplicateProject": { + "Type": 1, + "Value": true + } + } + } + } +} diff --git a/source/forms/LoginForm.cls b/source/forms/LoginForm.cls new file mode 100644 index 0000000..0c9e189 --- /dev/null +++ b/source/forms/LoginForm.cls @@ -0,0 +1,126 @@ +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +'--------------------------------------------------------------------------------------- +' Form: LoginForm +'--------------------------------------------------------------------------------------- +'/** +' User login form +'**/ +'--------------------------------------------------------------------------------------- +' +' user/login/LoginForm.frm +' _codelib/license.bas +' +' +Option Compare Database +Option Explicit + +#If USELOCALIZATION = 1 Then +Private WithEvents m_L10nDict As L10nDict +Attribute m_L10nDict.VB_VarHelpID = -1 +#End If + +Public Event Logon(ByVal LoginName As String, ByVal Password As String, ByRef Cancel As Boolean) +Public Event Cancelled() + +Public m_CloseFormOK As Boolean + +Private Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal Length As Long) + +Private Sub cmdCancel_Click() +On Error Resume Next + RaiseEvent Cancelled + m_CloseFormOK = True + DoCmd.Close acForm, Me.Name +End Sub + +Private Sub cmdLogin_Click() + + Dim strLoginName As String + Dim strLoginPassword As String + Dim bolCancel As Boolean + + strLoginName = Me.txtUID & vbNullString + strLoginPassword = Me.txtPwd & vbNullString + + If Len(strLoginName) * Len(strLoginPassword) = 0 Then + MsgBox "Please enter login name and password" + If Len(strLoginName) = 0 Then + Me.txtUID.SetFocus + Else + Me.txtPwd.SetFocus + End If + Exit Sub + End If + + RaiseEvent Logon(strLoginName, strLoginPassword, bolCancel) + If bolCancel Then + Me.txtPwd.SetFocus + Exit Sub + End If + + m_CloseFormOK = True + DoCmd.Close acForm, Me.Name + +End Sub + +Private Sub Form_Load() + + Dim Args() As String + Dim LoginFormBridgePtr As LongPtr + +#If USELOCALIZATION = 1 Then + L10n.TranslateControls Me.Controls + Set m_L10nDict = L10n +#End If + + If Len(Me.OpenArgs) > 0 Then 'OpenArgs= "ObjPtr@Caption@StandardUser" + Args = Split(Me.OpenArgs, "@") + + LoginFormBridgePtr = Val(Args(0)) + + Me.Caption = Args(1) + If UBound(Args) > 1 Then + Me.txtUID.Value = Args(2) + Else + Me.txtUID.Value = vbNullString + End If + + If Len(Me.txtUID.Value) > 0 Then + Me.txtPwd.SetFocus + End If + + End If + + Dim tempObj As Object + Set tempObj = GetObjectFromObjPtr(LoginFormBridgePtr) + If Not (tempObj Is Nothing) Then + Set tempObj.LoginForm = Me 'This makes the events possible despite dialogue mode + End If + +End Sub + +Private Sub Form_Unload(Cancel As Integer) +On Error Resume Next + If Not m_CloseFormOK Then RaiseEvent Cancelled +#If USELOCALIZATION = 1 Then + Set m_L10nDict = Nothing +#End If +End Sub + +Private Function GetObjectFromObjPtr(lPtr As LongPtr) As Object + + Dim obj As Object + CopyMemory obj, lPtr, 4 + Set GetObjectFromObjPtr = obj + CopyMemory obj, 0&, 4 + +End Function + +#If USELOCALIZATION = 1 Then +Private Sub m_L10nDict_LanguageChanged() + L10n.TranslateControls Me.Controls +End Sub +#End If diff --git a/source/forms/LoginForm.form b/source/forms/LoginForm.form new file mode 100644 index 0000000..2d2ac99 --- /dev/null +++ b/source/forms/LoginForm.form @@ -0,0 +1,155 @@ +Version =20 +VersionRequired =20 +Begin Form + AllowFilters = NotDefault + PopUp = NotDefault + RecordSelectors = NotDefault + ControlBox = NotDefault + AutoCenter = NotDefault + NavigationButtons = NotDefault + DividingLines = NotDefault + DefaultView =0 + ScrollBars =0 + ViewsAllowed =1 + TabularFamily =124 + BorderStyle =3 + PictureAlignment =2 + DatasheetGridlinesBehavior =3 + Cycle =1 + GridY =10 + Width =3911 + DatasheetFontHeight =10 + ItemSuffix =6 + Left =1000 + Top =1000 + Right =50000 + Bottom =50000 + OnUnload ="[Event Procedure]" + RecSrcDt = Begin + 0x68568eb19ee2e240 + End + Caption ="Login" + DatasheetFontName ="Arial" + OnLoad ="[Event Procedure]" + FilterOnLoad =0 + AllowLayoutView =0 + DatasheetGridlinesColor12 =12632256 + Begin + Begin Label + BackStyle =0 + FontName ="Tahoma" + End + Begin CommandButton + Width =1701 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin TextBox + FELineBreak = NotDefault + SpecialEffect =2 + OldBorderStyle =0 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + AsianLineBreak =255 + End + Begin Section + Height =1701 + BackColor =-2147483633 + Name ="Detailbereich" + Begin + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1583 + Top =225 + Width =2154 + Height =255 + FontSize =9 + BackColor =-2147483643 + ForeColor =-2147483640 + Name ="txtUID" + Begin + Begin Label + OverlapFlags =85 + Left =165 + Top =225 + Width =1293 + Height =255 + FontSize =9 + Name ="labLoginName" + Caption ="Login name" + Tag ="LANG:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1583 + Top =621 + Width =2154 + Height =255 + FontSize =9 + TabIndex =1 + BackColor =-2147483643 + ForeColor =-2147483640 + Name ="txtPwd" + InputMask ="Password" + Begin + Begin Label + OverlapFlags =85 + Left =165 + Top =621 + Width =1293 + Height =255 + FontSize =9 + Name ="labPassword" + Caption ="Password" + Tag ="LANG:" + End + End + End + Begin CommandButton + Default = NotDefault + OverlapFlags =85 + AccessKey =79 + Left =170 + Top =1133 + Width =1418 + Height =418 + TabIndex =2 + Name ="cmdLogin" + Caption ="&OK" + OnClick ="[Event Procedure]" + UnicodeAccessKey =79 + End + Begin CommandButton + Cancel = NotDefault + OverlapFlags =85 + AccessKey =65 + Left =2324 + Top =1133 + Width =1418 + Height =418 + TabIndex =3 + Name ="cmdCancel" + Caption ="&Abbrechen" + OnClick ="[Event Procedure]" + UnicodeAccessKey =65 + End + End + End + End +End +CodeBehindForm +' See "LoginForm.cls" diff --git a/source/forms/LoginForm.json b/source/forms/LoginForm.json new file mode 100644 index 0000000..816b054 --- /dev/null +++ b/source/forms/LoginForm.json @@ -0,0 +1,28 @@ +{ + "Info": { + "Class": "clsDbForm", + "Description": "LoginForm Print Settings" + }, + "Items": { + "Printer": { + "Orientation": "Portrait", + "PaperSize": "A4" + }, + "Margins": { + "LeftMargin": 1.0097, + "TopMargin": 1.0097, + "RightMargin": 1.0097, + "BotMargin": 1.0097, + "DataOnly": false, + "Width": 5, + "Height": 3, + "DefaultSize": true, + "Columns": 1, + "ColumnSpacing": 0.25, + "RowSpacing": 0, + "ItemLayout": "Horizontal Columns", + "FastPrint": 1, + "Datasheet": 1 + } + } +} diff --git a/source/forms/frmConfig_DBMS.cls b/source/forms/frmConfig_DBMS.cls new file mode 100644 index 0000000..0f46397 --- /dev/null +++ b/source/forms/frmConfig_DBMS.cls @@ -0,0 +1,451 @@ +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +'--------------------------------------------------------------------------------------- +' VBA Document: Form_frmConfig_DBMS +'--------------------------------------------------------------------------------------- +'/** +' +' Form_frmConfig_DBMS +' +' +' +'**/ +'--------------------------------------------------------------------------------------- +' +'--------------------------------------------------------------------------------------- +' Formular: frmConfig_DBMS +'--------------------------------------------------------------------------------------- +Option Compare Database +Option Explicit + +Private WithEvents m_DetailForm As Form_frmConfig_DBMS_SF_Data +Attribute m_DetailForm.VB_VarHelpID = -1 + +Private WithEvents m_L10nDict As L10nDict +Attribute m_L10nDict.VB_VarHelpID = -1 + +Private m_TemplateMode As Boolean + +Public Property Let TemplateMode(ByVal tm As Boolean) + m_TemplateMode = tm + Me.lstCID.Value = Null + InitForm + Me.lstCID.Value = Me.lstCID.Column(0, 0) + CidDetailForm.SetData Nz(Me.lstCID.Value, vbNullString) +End Property + +Private Property Get SourceDb() As DAO.Database + If m_TemplateMode Then + Set SourceDb = CodeDb + Else + Set SourceDb = CurrentDb + End If +End Property + +Private Property Get SourceConnection() As ADODB.Connection + If m_TemplateMode Then + Set SourceConnection = CodeProject.Connection + Else + Set SourceConnection = CurrentProject.Connection + End If +End Property + + +'--------------------------------------------------------------------------------------- +' Property: CidDetailForm (16.03.2009) +'--------------------------------------------------------------------------------------- +'/** +' +' CidDetailForm +' +' Form +' +'**/ +'--------------------------------------------------------------------------------------- +Private Property Get CidDetailForm() As Form + If m_DetailForm Is Nothing Then + InitDetailForm + End If + Set CidDetailForm = m_DetailForm +End Property + +Private Sub InitDetailForm() + With Me.sfrDetailForm + If Len(.SourceObject) = 0 Then + .SourceObject = "frmConfig_DBMS_SF_Data" + End If + Set m_DetailForm = .Form + End With + m_DetailForm.TemplateMode = m_TemplateMode +End Sub + +Private Sub InitConnectionList() + + Dim rst As DAO.Recordset + Dim strRowSource As String + + Set rst = SourceDb.OpenRecordset("SELECT C.CID FROM usys_DbmsConnection AS C ORDER BY C.ActiveConnection, C.CID", dbOpenForwardOnly, dbReadOnly) + 'Set Me.lstCID.Recordset = rst + 'Schleifendurchlauf statt Recordset-Zuweisung, da die Recordsetzuweisung erst aber Ac02 funktioniert + With rst + If Not .EOF Then + Do + strRowSource = strRowSource & ";" & .Fields(0).Value + .MoveNext + Loop Until .EOF + strRowSource = Mid$(strRowSource, 2) + End If + End With + + Me.lstCID.RowSource = strRowSource + +End Sub + +Private Function CheckConnectionTable() As Boolean + +On Error Resume Next + + If Not TableDefExists("usys_DbmsConnection", SourceDb) Then + If MsgBox("The required table 'usys_DbmsConnection' does not exist, should it be created?", vbOKCancel + vbQuestion) = vbOK Then + CheckConnectionTable = CreateConnectionTable(SourceConnection) + Else + CheckConnectionTable = False + Exit Function + End If + Else + CheckConnectionTable = True + End If + +End Function + +Private Sub cbxLangCode_AfterUpdate() + With Me.cbxLangCode + If IsNull(.Value) Then + .Value = "EN" + End If + L10n.LangCode = .Value + End With +End Sub + +Private Sub cmdNewCID_Click() +On Error GoTo HandleErr + + CreateNewCID + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub Form_Current() +On Error Resume Next + Me.lstCID.Value = Me.lstCID.Column(0, 0) + CidDetailForm.SetData Nz(Me.lstCID.Value, vbNullString) +End Sub + +Private Sub Form_Deactivate() +On Error Resume Next + 'Zur Sicherheit speichern, damit in anderen Formularen die neuesten Einstellungen gelten + CidDetailForm.SaveRecord +End Sub + +Private Sub InitForm() + + Dim backgroundForm As Long + + If Not CheckConnectionTable Then + DoCmd.Close acForm, Me.Name + Exit Sub + End If + + InitConnectionList + InitDetailForm + + If m_TemplateMode Then + backgroundForm = dcwBackgroundFormTemplates + Else + backgroundForm = dcwBackgroundForm + End If + + Me.Section(acDetail).BackColor = backgroundForm + Me.lstCID.BackColor = backgroundForm + +End Sub + +Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) +On Error GoTo HandleErr + + If KeyCode = vbKeyF1 Then + OpenHelpFile + KeyCode = 0 + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub Form_Load() +On Error GoTo HandleErr + + InitForm + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub Form_Open(Cancel As Integer) + Me.cbxLangCode.Value = L10n.LangCode + L10n.TranslateControls Me.Controls + Set m_L10nDict = L10n + SetFormCaption +End Sub + +Public Sub SetFormCaption() + + Dim FormCaption As String + + If m_TemplateMode Then + FormCaption = L10n.Text("Edit Template") + Me.cmdNewCID.Caption = L10n.Text("&New Template") + Else + FormCaption = "ACLib DBMS Connection Wizard " & ChrW(&H25AA) & " Version " & CurrentApplication.Version & " (" & L10n.Text("Classes & Modules") & ": SCC-Rev. " & SccRev & ")" + Me.cmdNewCID.Caption = L10n.Text("&New Connection") + End If + + Me.Caption = FormCaption + +End Sub + +Private Sub Form_Unload(Cancel As Integer) +On Error Resume Next + Set m_DetailForm = Nothing + DisposeWizard +End Sub + +Private Sub lstCID_AfterUpdate() +On Error GoTo HandleErr + + CidDetailForm.SetData Nz(Me.lstCID.Value, vbNullString) + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub lstCID_KeyDown(KeyCode As Integer, Shift As Integer) +On Error GoTo HandleErr + + If KeyCode = vbKeyDelete Then + deleteSelectedItem + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub deleteSelectedItem() + + Dim strCID As String + + If Me.lstCID.Column(1) = True Then + MsgBox "Eine aktivierte Verbindung kann nicht gelöscht werden!", vbCritical + vbOKOnly + Exit Sub + End If + strCID = Me.lstCID.Value + If MsgBox("Sollen die Daten von '" & strCID & "' gelöscht werden?", vbYesNo + vbDefaultButton2) = vbYes Then + CidDetailForm.SetNoData + Me.lstCID.Value = vbNullString + SourceDb.Execute "delete from usys_DbmsConnection where CID = " & SqlTools.TextToSqlText(strCID), dbFailOnError + InitConnectionList + End If + +End Sub + +Private Sub CopySelectedItem() + + Dim strCID As String + Dim strCIDnew As String + Dim lngCounter As Long + Dim db As DAO.Database + + strCID = Me.lstCID.Value + + Set db = SourceDb + lngCounter = 1 + strCIDnew = strCID & "_1" + Do While db.OpenRecordset("select count(*) from usys_DbmsConnection where CID='" & strCIDnew & "'")(0) > 0 + lngCounter = lngCounter + 1 + strCIDnew = strCID & "_" & lngCounter + Loop + + CidDetailForm.SetNoData + Me.lstCID.Value = vbNullString + + db.Execute "insert into usys_DbmsConnection (" & DCW_usys_DbmsConnection_Fields & ")" & _ + " select " & Replace(Replace(DCW_usys_DbmsConnection_Fields, "CID", SqlTools.TextToSqlText(strCIDnew)), "ActiveConnection", "false") & " from usys_DbmsConnection" & _ + " where CID = " & SqlTools.TextToSqlText(strCID), dbFailOnError + Set db = Nothing + + InitConnectionList + Me.lstCID.Value = strCIDnew + CidDetailForm.SetData strCIDnew + +End Sub + +Private Sub CreateNewCID() + Me.lstCID.Value = Null + CidDetailForm.CreateNewRecord +End Sub + +Private Sub OpenListboxContextMenu(ByVal X As Single, ByVal Y As Single) + + Dim mnu As WinApiShortcutMenu + + Set mnu = New WinApiShortcutMenu + With mnu + .ControlSection = acDetail + Set .AccessForm = Me + Set .MenuControl = Me.lstCID + If Len(Me.lstCID.Value) > 0 Then + .AddMenuItem 1, "markierten Eintrag löschen", MF_STRING + .AddMenuItem 2, "markierten Eintrag kopieren", MF_STRING + .AddMenuItem 0, "---", MF_SEPARATOR + End If + .AddMenuItem 3, "Neuen Eintrag erstellen", MF_STRING + End With + + Select Case mnu.OpenMenu(X, Y) + Case 1 + deleteSelectedItem + Case 2 + CopySelectedItem + Case 3 + CreateNewCID + Case Else + ' + End Select + +End Sub + +Private Sub lstCID_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 2 Then + OpenListboxContextMenu X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub m_DetailForm_CidStateChanged(ByVal currentCID As String) +On Error GoTo HandleErr + + InitConnectionList + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub m_DetailForm_CidValueChanged(ByVal newCID As String) +On Error GoTo HandleErr + + With Me.lstCID + .Value = Null + InitConnectionList + .Value = newCID + End With + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub m_L10nDict_LanguageChanged() + If Nz(Me.cbxLangCode.Value, vbNullString) <> L10n.LangCode Then + Me.cbxLangCode.Value = L10n.LangCode + End If + SetFormCaption + L10n.TranslateControls Me.Controls +End Sub + +Private Sub labCheckVersion_Click() + + Select Case L10n.ControlTag(Me.labCheckVersion.Tag) + Case "unchecked" + SetNewVersionInfo + Case "NewVersionExists" + OpenDownloadSource + Case Else + ' + End Select + +End Sub + +Private Sub SetNewVersionInfo() + + Dim AhProcParams(1) As Variant + Dim AhResumeMode As ApplicationHandlerResumeModes + Dim AhResumeMessage As Variant + + Call CurrentApplication.CallExtensionProcedure("AppVersion", "NewVersionExists", AhResumeMode, AhResumeMessage, AhProcParams) + + If AhResumeMode <> AppResumeMode_Completed Then + If AhResumeMode = AppResumeMode_Error Then + If Len(AhResumeMessage) > 0 Then + MsgBox AhResumeMessage, vbExclamation, "Error during version check" + End If + End If + Exit Sub + End If + + With Me.labCheckVersion + If AhResumeMessage = False Then + .Caption = L10n.Text("Latest version is installed") + .Tag = "VersionUptodate" & L10n.LangSeparatorChar & "LANG:Latest version is installed" + .ForeColor = 0 + .FontUnderline = False + ElseIf AhResumeMessage = True Then + .Caption = FormatText("New Version ({0}) available", AhProcParams(0)) + .ControlTipText = AhProcParams(1) + .Tag = "NewVersionExists" + Else + + End If + End With + +End Sub + +Private Sub OpenDownloadSource() + Application.FollowHyperlink APPLICATION_DOWNLOADSOURCE, , True, False +End Sub + +Private Function GetCheckedControlName(ByVal ControlNameToCheck As String) As String + GetCheckedControlName = Replace(ControlNameToCheck, " ", "_") +End Function diff --git a/source/forms/frmConfig_DBMS.form b/source/forms/frmConfig_DBMS.form new file mode 100644 index 0000000..e4b829e --- /dev/null +++ b/source/forms/frmConfig_DBMS.form @@ -0,0 +1,204 @@ +Version =20 +VersionRequired =20 +Begin Form + AllowFilters = NotDefault + RecordSelectors = NotDefault + ShortcutMenu = NotDefault + AutoCenter = NotDefault + NavigationButtons = NotDefault + AllowDeletions = NotDefault + DividingLines = NotDefault + AllowAdditions = NotDefault + KeyPreview = NotDefault + DefaultView =0 + ScrollBars =0 + TabularFamily =119 + BorderStyle =3 + PictureAlignment =2 + DatasheetGridlinesBehavior =3 + Cycle =1 + GridY =10 + Width =13606 + DatasheetFontHeight =10 + ItemSuffix =25 + Left =1000 + Top =1000 + Right =50000 + Bottom =50000 + OnUnload ="[Event Procedure]" + RecSrcDt = Begin + 0xdc0c5e0e39c2e240 + End + Caption ="DBMS-Connection-Wizard: DBMS-Verbindung konfigurieren" + OnCurrent ="[Event Procedure]" + OnOpen ="[Event Procedure]" + DatasheetFontName ="Arial" + OnKeyDown ="[Event Procedure]" + OnDeactivate ="[Event Procedure]" + OnLoad ="[Event Procedure]" + FilterOnLoad =0 + ShowPageMargins =0 + AllowLayoutView =0 + DatasheetGridlinesColor12 =12632256 + Begin + Begin Label + BackStyle =0 + FontName ="Tahoma" + End + Begin CommandButton + Width =1701 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin TextBox + FELineBreak = NotDefault + SpecialEffect =2 + OldBorderStyle =0 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + AsianLineBreak =255 + End + Begin ListBox + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + Height =1417 + LabelX =-1701 + FontName ="Tahoma" + End + Begin ComboBox + AddColon = NotDefault + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontSize =11 + FontName ="Calibri" + AllowValueListEdits =1 + InheritValueList =1 + ThemeFontIndex =1 + BackThemeColorIndex =1 + BorderThemeColorIndex =1 + BorderShade =65.0 + ForeThemeColorIndex =2 + ForeShade =50.0 + GridlineThemeColorIndex =1 + GridlineShade =65.0 + End + Begin Subform + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + Height =1701 + End + Begin Section + CanGrow = NotDefault + Height =8078 + BackColor =-2147483633 + Name ="Detailbereich" + Begin + Begin ListBox + RowSourceTypeInt =1 + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =113 + Top =338 + Width =1581 + Height =7261 + FontSize =10 + FontWeight =700 + BackColor =-2147483633 + Name ="lstCID" + RowSourceType ="Value List" + ColumnWidths ="1560" + AfterUpdate ="[Event Procedure]" + OnKeyDown ="[Event Procedure]" + OnMouseUp ="[Event Procedure]" + + End + Begin Subform + OverlapFlags =85 + Left =1870 + Top =338 + Width =11625 + Height =7680 + TabIndex =1 + Name ="sfrDetailForm" + Tag ="frmConfig_DBMS_SF_Data" + + End + Begin CommandButton + OverlapFlags =85 + AccessKey =78 + Left =120 + Top =7675 + Width =1582 + Height =343 + TabIndex =2 + Name ="cmdNewCID" + Caption ="&New Connection" + OnClick ="[Event Procedure]" + Tag ="LANG:" + UnicodeAccessKey =78 + + End + Begin ComboBox + LimitToList = NotDefault + TabStop = NotDefault + RowSourceTypeInt =1 + OldBorderStyle =0 + OverlapFlags =85 + TextAlign =2 + IMESentenceMode =3 + Left =12923 + Top =53 + Width =561 + Height =228 + FontSize =8 + TabIndex =3 + BackColor =14151142 + Name ="cbxLangCode" + RowSourceType ="Value List" + RowSource ="\"EN\";\"DE\"" + AfterUpdate ="[Event Procedure]" + FontName ="Tahoma" + HorizontalAnchor =1 + AllowValueListEdits =0 + InheritValueList =0 + + ThemeFontIndex =-1 + BackThemeColorIndex =-1 + BorderThemeColorIndex =-1 + BorderShade =100.0 + ForeThemeColorIndex =-1 + ForeShade =100.0 + GridlineThemeColorIndex =-1 + GridlineShade =100.0 + End + Begin Label + FontUnderline = NotDefault + OverlapFlags =85 + TextAlign =3 + Left =10317 + Top =56 + Width =2455 + Height =240 + ForeColor =16737792 + Name ="labCheckVersion" + Caption ="Check wizard version" + OnClick ="[Event Procedure]" + Tag ="unchecked|LANG:" + VerticalAnchor =1 + End + End + End + End +End +CodeBehindForm +' See "frmConfig_DBMS.cls" diff --git a/source/forms/frmConfig_DBMS.json b/source/forms/frmConfig_DBMS.json new file mode 100644 index 0000000..f2e4b2c --- /dev/null +++ b/source/forms/frmConfig_DBMS.json @@ -0,0 +1,28 @@ +{ + "Info": { + "Class": "clsDbForm", + "Description": "frmConfig_DBMS Print Settings" + }, + "Items": { + "Printer": { + "Orientation": "Portrait", + "PaperSize": "A4" + }, + "Margins": { + "LeftMargin": 1.0097, + "TopMargin": 1.0097, + "RightMargin": 1.0097, + "BotMargin": 1.0097, + "DataOnly": false, + "Width": 5, + "Height": 3, + "DefaultSize": true, + "Columns": 1, + "ColumnSpacing": 0.25, + "RowSpacing": 0, + "ItemLayout": "Horizontal Columns", + "FastPrint": 1, + "Datasheet": 1 + } + } +} diff --git a/source/forms/frmConfig_DBMS_SF_Data.cls b/source/forms/frmConfig_DBMS_SF_Data.cls new file mode 100644 index 0000000..9b5fa7e --- /dev/null +++ b/source/forms/frmConfig_DBMS_SF_Data.cls @@ -0,0 +1,1092 @@ +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Compare Database +Option Explicit + +'Basis-Datenherkunft +Private Const m_DATASOURCE As String = _ + "SELECT C.CID, C.ActiveConnection, C.DBMS, C.dbmsConnectionMode, C.dbmsOleDbProvider, C.dbmsOdbcDriver, C.dbmsServer, C.dbmsPort, C.dbmsDatabase, X.dbmsEnabled, C.dbmsUseTrustedConnection, C.dbmsUseLoginForm, C.dbmsUser, C.dbmsPwd, C.dbmsOptionsODBC, C.dbmsOptionsOLEDB, C.dbmsDSN, C.dbmsConStrODBC, C.dbmsConStrOLEDB, C.Remarks, X.XdbmsConnectionModes, X.XdbmsServer, X.XdbmsPort, X.XdbmsDatabase, X.XdbmsUseLoginForm, X.XdbmsUseTrustedConnection, X.XdbmsUser, X.XdbmsPwd, X.XdbmsOptionsODBC, X.XdbmsOptionsOLEDB, X.XdbmsDSN, X.XdbmsConStrODBC, X.XdbmsConStrOLEDB, X.XdbmsOledbProvider, X.XdbmsOdbcDriver, X.DriverODBC, X.DriverOLEDB" & _ + " FROM usys_DbmsConnection_X AS X RIGHT JOIN usys_DbmsConnection AS C ON X.DBMS = C.DBMS" + +Public Event CidValueChanged(ByVal newCID As String) +Public Event CidStateChanged(ByVal currentCID As String) + +Private m_OpenModules As Long +Private m_CodeModulImporter As AppFileCodeModulTransfer + +Private m_TemplatesForm As Form_frmConfig_DBMS + +Private m_TemplateMode As Boolean + +Private WithEvents m_L10nDict As L10nDict +Attribute m_L10nDict.VB_VarHelpID = -1 + +Public Property Let TemplateMode(ByVal tm As Boolean) + m_TemplateMode = tm + InitForm +End Property + +'Datenquellen für Formular (je nachdem ob Formular für FE-Verbindung bzw. Vorlage verwendet wird): +Private Property Get SourceDb() As DAO.Database + If m_TemplateMode Then 'DB des Add-In verwenden + Set SourceDb = CodeDb + Else 'FE-Databaseinstanz einsetzen + Set SourceDb = CurrentDb + End If +End Property + +Private Property Get DataSource() As String + If m_TemplateMode Then 'unveränderte Basis-Datenherkunft verwenden + DataSource = m_DATASOURCE + Else 'Basis-Datenherkunft anpassen, damit usys_DbmsConnection_X aus Add-In verwendet wird + DataSource = Replace(m_DATASOURCE, "usys_DbmsConnection_X", "[" & CodeDb.Name & "].usys_DbmsConnection_X") + End If +End Property + +'Datenquelle für Formular einstellen +Public Sub SetData(ByVal sCID As String) +'sCID: Übergabe der Verbindungskennung + + Dim strSQL As String + + If Len(sCID) > 0 Then + strSQL = DataSource & " where CID = " & SqlTools.TextToSqlText(sCID) + Set Me.Recordset = SourceDb.OpenRecordset(strSQL, dbOpenDynaset) + Else + SetNoData + End If + +End Sub + +Public Sub SetNoData() + Me.RecordSource = "SELECT NULL AS CID, NULL AS ActiveConnection, NULL AS DBMS, NULL AS dbmsConnectionMode, NULL AS dbmsOleDbProvider, NULL AS dbmsOdbcDriver, NULL AS dbmsServer, NULL AS dbmsPort, NULL AS dbmsDatabase, NULL AS dbmsEnabled, NULL AS dbmsUseTrustedConnection, NULL AS dbmsUseLoginForm, NULL AS dbmsUser, NULL AS dbmsPwd, NULL AS dbmsOptionsODBC, NULL AS dbmsOptionsOLEDB, NULL AS dbmsDSN, NULL AS dbmsConStrODBC, NULL AS dbmsConStrOLEDB, NULL AS Remarks, NULL AS XdbmsConnectionModes, NULL AS XdbmsServer, NULL AS XdbmsPort, NULL AS XdbmsDatabase, NULL AS XdbmsUseLoginForm, NULL AS XdbmsUseTrustedConnection, NULL AS XdbmsUser, NULL AS XdbmsPwd, NULL AS XdbmsOptionsODBC, NULL AS XdbmsOptionsOLEDB, NULL AS XdbmsDSN, NULL AS XdbmsConStrODBC, NULL AS XdbmsConStrOLEDB, NULL AS XdbmsOledbProvider, NULL AS XdbmsOdbcDriver, NULL AS DriverODBC, NULL AS DriverOLEDB FROM tab1DS where 1=0" +End Sub + +Public Sub SaveRecord() + If Me.Dirty Then Me.Dirty = False +End Sub + +Public Sub CreateNewRecord() + + Set Me.Recordset = SourceDb.OpenRecordset(DataSource & " where 1=0", dbOpenDynaset) + + Me.AllowAdditions = True + + Me.txtCID.Locked = False + Me.txtCID.SetFocus + + Me.txtCID.BackColor = dcwBackgroundTextboxEdit + Me.txtCID.BorderStyle = 1 + Me.txtCID.BorderColor = vbRed + + Me.cbxDBMS.Visible = True + Me.cbxDBMS.BackColor = dcwBackgroundTextboxEdit + 'Me.cbxDBMS.BorderStyle = 1 + Me.cbxDBMS.BorderColor = vbRed + + Me.txtDBMS.Visible = False + SetLayoutMode + +End Sub + +Private Sub cbTrustedConnection_AfterUpdate() + +On Error GoTo HandleErr + + If (Me.cbTrustedConnection.Value = True) And (Me!XdbmsUseTrustedConnection > 0) Then + Me.cbUseLoginForm.Value = False + Me.txtDbmsUser.Value = Null + Me.txtDbmsPwd.Value = Null + End If + + SetControlMode + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + + +Private Sub cbActiveConnection_AfterUpdate() + +On Error GoTo HandleErr + + Me.Dirty = False + If Me.cbActiveConnection.Value = True Then + SourceDb.Execute "update usys_DbmsConnection set ActiveConnection = 0 where CID <> " & SqlTools.TextToSqlText(Me!CID), dbFailOnError + ClearConnectionInfos + CurrentConnectionInfo.ConnectionIdentifier = Nz(Me!CID, vbNullString) + Else + ClearApplicationConnectionInfo + DisposeDbConnection + End If + + Me.cmdLinkTables.Enabled = (Me.cbActiveConnection.Value = True) + Me.cmdTestSQL.Enabled = (Me.cbActiveConnection.Value = True) + RaiseEvent CidStateChanged(Me!CID) + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub SetControlMode() + + Dim bolTrustedConnection As Boolean + Dim bolUseLoginForm As Boolean + + bolUseLoginForm = Me.cbUseLoginForm.Value + bolTrustedConnection = Me.cbTrustedConnection.Value And (Me!XdbmsUseTrustedConnection > 0) + + Me.txtDbmsUser.Enabled = Not bolTrustedConnection + Me.txtDbmsPwd.Enabled = Not (bolTrustedConnection Or bolUseLoginForm) + If bolTrustedConnection Then + Me.txtDbmsUser.Value = Null + Me.txtDbmsPwd.Value = Null + ElseIf bolUseLoginForm Then + Me.txtDbmsPwd.Value = Null + End If + + If Me!XdbmsUseTrustedConnection = 0 And Me.cbTrustedConnection.Value = True Then + Me.labDbmsUser.Caption = "Loginadmin:" + Else + Me.labDbmsUser.Caption = "User:" + End If + +End Sub + +Private Sub SetLayoutMode() + + Dim bolTrustedConnection As Boolean + Dim bolUseLoginForm As Boolean + Dim bolIsMSJET As Boolean + Dim lngConnectionMode As Long + Dim lngAllowedConnectionModes As Long + Dim strDbmsName As String + Dim backgroundHeader As Long + + If m_TemplateMode Then + backgroundHeader = dcwBackgroundLightHeaderTemplates + Else + backgroundHeader = dcwBackgroundLightHeader + End If + + Me!sysFirst.SetFocus + + Me.cbxDBMS.Visible = (Len(Me.cbxDBMS & "") = 0) + Me.txtDBMS.Visible = Not Me.cbxDBMS.Visible + Me.txtCID.Locked = (Len(Me.txtCID & "") > 0) + Me.txtCID.BorderStyle = Abs(Not Me.txtCID.Locked) + If Me.txtCID.Locked Then + Me.txtCID.BackColor = backgroundHeader + Else + Me.txtCID.BackColor = dcwBackgroundTextboxEdit + End If + + lngConnectionMode = Nz(Me!dbmsConnectionMode, -1) + If lngConnectionMode = 0 Then lngConnectionMode = -1 'damit alle Parameterfelder deaktiviert werden + lngAllowedConnectionModes = Nz(Me!XdbmsConnectionModes, 0) + + Me.cbActiveConnection.Enabled = (lngConnectionMode > 0) + Me.cmdCheckConnection.Enabled = (lngConnectionMode > 0) + + Me.ogDbmsConnectionMode.Enabled = (lngAllowedConnectionModes > 0) + Me.txtRemarks.Enabled = (lngAllowedConnectionModes > 0) + + Me.optDbmsConnectionMode1.Enabled = (lngAllowedConnectionModes And 1) = 1 + Me.optDbmsConnectionMode2.Enabled = (lngAllowedConnectionModes And 2) = 2 + Me.optDbmsConnectionMode4.Enabled = (lngAllowedConnectionModes And 4) = 4 + + strDbmsName = Nz(Me!DBMS, vbNullString) + bolIsMSJET = (strDbmsName = "MSJET") + Me.cmdSelectFile.Visible = bolIsMSJET + If bolIsMSJET Then + Me.labDatabase.Caption = "mdb-&Datei:" + Me.txtDbmsDatabase.Width = Me.cmdSelectFile.Left - Me.txtDbmsDatabase.Left - 100 + Else + If strDbmsName = "DB2" Then + Me.labDatabase.Caption = "&DBALIAS:" + Else + Me.labDatabase.Caption = "&Database:" + End If + Me.txtDbmsDatabase.Width = Me.txtDbmsPort.Left + Me.txtDbmsPort.Width - Me.txtDbmsDatabase.Left + End If + + Me.txtDbmsServer.Enabled = ((Nz(Me!XdbmsServer, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsPort.Enabled = ((Nz(Me!XdbmsPort, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsDatabase.Enabled = ((Nz(Me!XdbmsDatabase, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsDSN.Enabled = ((Nz(Me!XdbmsDSN, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsOptionsODBC.Enabled = ((Nz(Me!XdbmsOptionsODBC, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsOptionsOLEDB.Enabled = ((Nz(Me!XdbmsOptionsOLEDB, 255) And lngConnectionMode) = lngConnectionMode) + Me.cbTrustedConnection.Enabled = ((Nz(Me!XdbmsUseTrustedConnection, 255) And lngConnectionMode) = lngConnectionMode) + Me.cbUseLoginForm.Enabled = ((Nz(Me!XdbmsUseLoginForm, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsOleDbProvider.Enabled = ((Nz(Me!XdbmsOledbProvider, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsOdbcDriver.Enabled = ((Nz(Me!XdbmsOdbcDriver, 255) And lngConnectionMode) = lngConnectionMode) + + Me.txtDbmsOleDbProvider.Format = "@;;""" & Me!DriverOLEDB + Me.txtDbmsOdbcDriver.Format = "@;;""" & Me!DriverODBC + + Me.txtDbmsConStrODBC.Enabled = ((Nz(Me!XdbmsConStrODBC, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsConStrOLEDB.Enabled = ((Nz(Me!XdbmsConStrOLEDB, 255) And lngConnectionMode) = lngConnectionMode) + + bolUseLoginForm = Nz(Me.cbUseLoginForm.Value, False) + bolTrustedConnection = Nz(Me.cbTrustedConnection.Value, False) And (Nz(Me!XdbmsUseTrustedConnection, 0) = 255) + + Me.txtDbmsUser.Enabled = (Not bolTrustedConnection) And ((Nz(Me!XdbmsUser, 255) And lngConnectionMode) = lngConnectionMode) + Me.txtDbmsPwd.Enabled = (Not bolUseLoginForm) And (Not bolTrustedConnection) And ((Nz(Me!XdbmsPwd, 255) And lngConnectionMode) = lngConnectionMode) + + If Me!XdbmsUseTrustedConnection = 0 And Me.cbTrustedConnection.Value = True Then + Me.labDbmsUser.Caption = "Loginadmin:" + Else + Me.labDbmsUser.Caption = "User:" + End If + +End Sub + +Private Sub cbUseLoginForm_AfterUpdate() + +On Error GoTo HandleErr + + If Me.cbTrustedConnection = True And Me.cbUseLoginForm = True Then + Me.cbTrustedConnection = False + End If + SetControlMode + + CheckConditionalCompilationArgumentsString Me.cbUseLoginForm + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cbxDBMS_AfterUpdate() + RefreshDbmsControl +End Sub + +Private Sub RefreshDbmsControl() + + If Me.NewRecord Then + If Len(Me.cbxDBMS) > 0 Then + Me.cbxDBMS.BorderColor = dcwControlBorderColor + Else + Me.cbxDBMS.BorderColor = vbRed + End If + + If (Len(Me.cbxDBMS.Value) * Len(Me.txtCID.Value)) > 0 Then + SaveRecord + SetLayoutMode + RaiseEvent CidValueChanged(Nz(Me.txtCID.Value, vbNullString)) + ElseIf Len(Me.txtCID & vbNullString) = 0 Then + Me.txtCID.SetFocus + End If + Else + SetLayoutMode + End If + + SetDbmsDriverSource + +End Sub + +Private Sub cbxDBMS_Enter() +On Error GoTo HandleErr + + If Len(Me.cbxDBMS.RowSource) = 0 Then + Me.cbxDBMS.RowSource = "SELECT X.DBMS FROM usys_DbmsConnection_X AS X ORDER BY X.seq" + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub cbxDBMS_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 2 Then + OpenContextMenu Me.cbxDBMS, X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub cmdCheckConnection_Click() + + Dim strCID As String + Dim oDbConnectionInfo As DbConnectionInfo + Dim ErrMsg As String + +On Error GoTo HandleErr + + If Me.Dirty Then Me.Dirty = False + + strCID = Nz(Me!CID, vbNullString) + If Len(strCID) = 0 Then Exit Sub + + Set oDbConnectionInfo = New DbConnectionInfo + + If Me.cbUseLoginForm Then + oDbConnectionInfo.LoginFormName = "LoginForm" + End If + + oDbConnectionInfo.ConnectionIdentifier = strCID 'Übergabe der Verbindungskennung + If oDbConnectionInfo.CheckConnection(ErrMsg) = True Then + MsgBox "Connection was successful" + Else + If Len(ErrMsg) > 0 Then ErrMsg = vbNewLine & vbNewLine & ErrMsg + MsgBox "Connection could not be established." & ErrMsg + End If + Set oDbConnectionInfo = Nothing + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdHelp_Click() +On Error GoTo HandleErr + + OpenHelpFile + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub cmdLinkTables_Click() +On Error GoTo HandleErr + + DoCmd.OpenForm DCW_LinkTablesFormName, , , , , , Me.Name + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub cmdSelectFile_Click() + + Dim strFile As String + Dim strSearchDir As String + Dim lngPos As Long + +On Error GoTo HandleErr + + strSearchDir = Nz(Me.txtDbmsDatabase, vbNullString) + If Len(strSearchDir) > 0 Then + lngPos = InStrRev(strSearchDir, "\") + If lngPos > 0 Then + strSearchDir = Left$(strSearchDir, lngPos - 1) + Else + strSearchDir = vbNullString + End If + End If + + WizHook.Key = 51488399 + WizHook.GetFileName Me.Hwnd, CurrentApplication.ApplicationName, L10n.Text("Select database file"), "Select", _ + strFile, CurrentProject.Path, "*.mdb", 0, 0, 0, True + If Len(strFile) > 0 Then + Me.txtDbmsDatabase.Value = strFile + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub Form_AfterUpdate() +On Error GoTo HandleErr + + ClearConnectionInfos + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub ClearConnectionInfos() + If Me.cbActiveConnection.Value = True Then + CurrentConnectionInfo.ClearConnectionInfo + ClearApplicationConnectionInfo + End If +End Sub + +Private Sub Form_Current() + +On Error GoTo HandleErr + + SetLayoutMode + + If Me.RecordsetClone.RecordCount = 0 Then Exit Sub + + Me.cmdLinkTables.Enabled = (Nz(Me.cbActiveConnection.Value, False) = True) + Me.cmdTestSQL.Enabled = (Nz(Me.cbActiveConnection.Value, False) = True) + + If Not m_TemplateMode Then + CheckModules + End If + + SetDbmsDriverSource + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub Form_KeyDown(KeyCode As Integer, Shift As Integer) +On Error GoTo HandleErr + + If KeyCode = vbKeyF1 Then + OpenHelpFile + KeyCode = 0 + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub Form_Load() +On Error Resume Next + InitForm +End Sub + +Private Sub InitForm() + + Dim backgroundForm As Long + Dim backgroundHeader As Long + + Dim lngMargin As Long + + lngMargin = Me.labDatabase.Left + + If m_TemplateMode Then + backgroundForm = dcwBackgroundFormTemplates + backgroundHeader = dcwBackgroundLightHeaderTemplates + Else + backgroundForm = dcwBackgroundForm + backgroundHeader = dcwBackgroundLightHeader + End If + + Me.Section(acDetail).BackColor = backgroundForm + Me.rectHeader.BackColor = backgroundHeader + Me.txtCID.BackColor = backgroundHeader + Me.txtDBMS.BackColor = backgroundHeader + Me.cbxDBMS.BackColor = backgroundHeader + + Me.cbActiveConnection.Visible = Not m_TemplateMode + + Me.cmdLinkTables.Visible = Not m_TemplateMode + Me.cmdTestSQL.Visible = Not m_TemplateMode + Me.cmdHelp.Visible = Not m_TemplateMode + + Me.labCopyModulAccUtil.Visible = Not m_TemplateMode + Me.labCopyModulDbConnectionHandler.Visible = Not m_TemplateMode + Me.labCopyModulDbConnectionInfo.Visible = Not m_TemplateMode + Me.labCopyModules.Visible = Not m_TemplateMode + + Me.labCopyCaption.Visible = Not m_TemplateMode + Me.labCaptionCopyModulAccUtil.Visible = Not m_TemplateMode + Me.labCaptionCopyModulDbConnectionHandler.Visible = Not m_TemplateMode + Me.labCaptionCopyModulDbConnectionInfo.Visible = Not m_TemplateMode + Me.labCopyCaption.Visible = Not m_TemplateMode + + Me.txtRemarks.Height = 0 + If m_TemplateMode Then + Me.labCaptionRemarks.Top = Me.ogDbmsConnectionMode.Top 'Me.txtDbmsDatabase.Top - Me.labCaptionRemarks.Height + Else + Me.labCaptionRemarks.Top = Me.labProviderDriver.Top + End If + Me.txtRemarks.Top = Me.labCaptionRemarks.Top + Me.labCaptionRemarks.Height + Me.txtRemarks.Height = Me.txtDbmsConStrODBC.Top + Me.txtDbmsConStrODBC.Height - Me.txtRemarks.Top + + L10n.TranslateControls Me.Controls + Set m_L10nDict = L10n + +End Sub + +Private Sub Form_Unload(Cancel As Integer) + Set m_L10nDict = Nothing +End Sub + +Private Sub m_L10nDict_LanguageChanged() + L10n.TranslateControls Me.Controls +End Sub + +Private Sub labCopyCaption_MouseMove(Button As Integer, Shift As Integer, X As Single, Y As Single) + modWinApi_Mouse.MouseCursor IDC_HAND +End Sub + +Private Sub labDbmsCaption_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 2 Then + OpenContextMenu Me.labDbmsCaption, X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub ogDbmsConnectionMode_AfterUpdate() +On Error GoTo HandleErr + + SetLayoutMode + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub rectHeader_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 2 Then + OpenContextMenu Me.rectHeader, X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub txtCID_AfterUpdate() +On Error GoTo HandleErr + + RefreshCidControl + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub RefreshCidControl() + + If Me.NewRecord Then + If Len(Me.txtCID) > 0 Then + Me.txtCID.BorderColor = 8421504 + Else + Me.txtCID.BorderColor = vbRed + End If + + If (Len(Me.cbxDBMS.Value) * Len(Me.txtCID.Value)) > 0 Then + SaveRecord + SetLayoutMode + RaiseEvent CidValueChanged(Nz(Me.txtCID.Value, vbNullString)) + End If + + Else + Me.txtCID.Locked = True + Me.txtCID.BorderStyle = 0 + SaveRecord + RaiseEvent CidValueChanged(Nz(Me.txtCID.Value, vbNullString)) + End If + +End Sub + +Private Sub txtCID_DblClick(Cancel As Integer) + +On Error GoTo HandleErr + + Me.txtCID.Locked = False + Me.txtCID.BorderStyle = 1 + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub txtCID_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 2 Then + OpenContextMenu Me.txtCID, X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub txtDBMS_GotFocus() + +On Error GoTo HandleErr + + Me.cbxDBMS.Visible = True + Me.cbxDBMS.SetFocus + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub OpenContextMenu(ByRef ctlMenuControl As Control, ByVal X As Single, ByVal Y As Single) + + Dim mnu As WinApiShortcutMenu + Dim i As Long + Dim rst As DAO.Recordset + Dim cidArray As Variant + Dim lngSelectedMenuItem As Long + Dim lngCidArraySize As Long + + If m_TemplateMode Then 'die Vorlagenansicht ist bereits aktiviert + Exit Sub + End If + + Set mnu = New WinApiShortcutMenu + + With mnu + .ControlSection = acDetail + Set .AccessForm = Me + Set .MenuControl = ctlMenuControl + + .AddMenuItem -1, "Vorlagen bearbeiten", MenuItemStyle.MF_STRING + .AddMenuItem -2, "---", MF_SEPARATOR + + Set rst = CodeDb.OpenRecordset("select CID FROM usys_DbmsConnection order by CID", dbOpenSnapshot, dbReadOnly) + If Not rst.EOF Then + cidArray = rst.GetRows(rst.RecordCount) + lngCidArraySize = UBound(cidArray, 2) + Else + lngCidArraySize = -1 + End If + rst.Close + Set rst = Nothing + + For i = 0 To lngCidArraySize + .AddMenuItem i + 1, cidArray(0, i), MF_STRING, 1 + Next + If i > 0 Then + .AddMenuItem 999, "Parameter von Vorlage übernehmen", MF_STRING Or MF_POPUP, 1 + Else + .AddMenuItem 999, "Parameter von Vorlage übernehmen", MF_STRING + MF_GRAYED + End If + + End With + + lngSelectedMenuItem = mnu.OpenMenu(X, Y) + If lngSelectedMenuItem = -1 Then + OpenTemplates + ElseIf lngSelectedMenuItem > 0 Then + CopyTemplate cidArray(0, lngSelectedMenuItem - 1) + End If + +End Sub + +Private Sub CopyTemplate(ByVal sCID As String) + + Dim rst As DAO.Recordset + Dim fld As DAO.Field + Dim strSQL As String + + strSQL = "select DBMS, dbmsConnectionMode, dbmsOleDbProvider, dbmsOdbcDriver," & _ + " dbmsServer, dbmsPort, dbmsDatabase, dbmsUseTrustedConnection, dbmsUseLoginForm," & _ + " dbmsUser, dbmsPwd, dbmsOptionsODBC, dbmsOptionsOLEDB, dbmsDSN, dbmsConStrODBC, dbmsConStrOLEDB" & _ + " FROM usys_DbmsConnection where CID = " & SqlTools.TextToSqlText(sCID) + + Set rst = CodeDb.OpenRecordset(strSQL, dbOpenForwardOnly, dbReadOnly) + With rst + For Each fld In rst.Fields + Me.Controls(fld.Name).Value = fld.Value + Next + .Close + End With + Set rst = Nothing + + If IsNull(Me!CID) Then + Set rst = SourceDb.OpenRecordset("select CID from usys_DbmsConnection where CID = " & SqlTools.TextToSqlText(sCID), dbOpenForwardOnly, dbReadOnly) + If rst.EOF Then + Me!CID = sCID + RefreshCidControl + End If + rst.Close + Set rst = Nothing + End If + RefreshDbmsControl + +End Sub + +Private Sub OpenTemplates() + Set m_TemplatesForm = New Form_frmConfig_DBMS + m_TemplatesForm.TemplateMode = True + m_TemplatesForm.Visible = True +End Sub + +Private Sub txtDBMS_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 2 Then + OpenContextMenu Me.txtDBMS, X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub SetDbmsDriverSource() + Me.txtDbmsOdbcDriver.RowSource = "SELECT Driver FROM usys_DbmsConnection_X_Driver WHERE DBMS = " & SqlTools.TextToSqlText(Me!txtDBMS.Value) & " AND ConMode='ODBC'" + Me.txtDbmsOleDbProvider.RowSource = "SELECT Driver FROM usys_DbmsConnection_X_Driver WHERE DBMS = " & SqlTools.TextToSqlText(Me!txtDBMS.Value) & " AND ConMode='OLEDB'" +End Sub + +Private Sub txtDbmsOdbcDriver_Enter() +On Error GoTo HandleErr + + Me.txtDbmsOdbcDriver.ForeColor = 0 + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub txtDbmsOdbcDriver_Exit(Cancel As Integer) +On Error GoTo HandleErr + + Me.txtDbmsOdbcDriver.ForeColor = &H808080 + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub txtDbmsOleDbProvider_DblClick(Cancel As Integer) + DoCmd.OpenTable "usys_DbmsConnection_X_Driver", acViewNormal, acEdit +End Sub + +Private Sub txtDbmsOleDbProvider_Enter() +On Error GoTo HandleErr + + Me.txtDbmsOleDbProvider.ForeColor = 0 + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub txtDbmsOleDbProvider_Exit(Cancel As Integer) +On Error GoTo HandleErr + + Me.txtDbmsOleDbProvider.ForeColor = &H808080 + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdTestSQL_Click() +On Error GoTo HandleErr + + DoCmd.OpenForm DCW_TestSqlFormName + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub OpenReplaceModulesContextMenu(ByRef MenuControlRef As Control, ByVal X As Single, ByVal Y As Single) + + Dim mnu As WinApiShortcutMenu + Dim SelectedMenuItem As Long + + If m_TemplateMode Then + Exit Sub + End If + + Set mnu = New WinApiShortcutMenu + + With mnu + .ControlSection = acDetail + Set .AccessForm = Me + Set .MenuControl = MenuControlRef + + .AddMenuItem 3, L10n.Text("Update code modules in add-in from SCC repository (master).") + .AddMenuItem 4, L10n.Text("Update code modules in add-in from SCC repository (draft).") + .AddMenuItem 0, "", MF_SEPARATOR + .AddMenuItem 1, L10n.Text("Renew all code modules (existing modules are overwritten)") + + End With + + SelectedMenuItem = mnu.OpenMenu(X, Y) + Select Case SelectedMenuItem + Case 1 + ReplaceAllModules + Case 3 + RefreshCodeModulesFromSccRepo False + Case 4 + RefreshCodeModulesFromSccRepo True + Case Else + ' + End Select + + Set mnu = Nothing + +End Sub + +Private Sub ReplaceAllModules() + + Dim bolReplaced As Boolean + +On Error Resume Next + + bolReplaced = ReplaceCodeModules("SqlTools", "defDbConnection", "DbConnectionInfo", "AdodbHandler", "DaoHandler", "OdbcHandler", _ + "DbConnectionHandler", "DbConnectionSettings", "DbConnectionManager", "modDbConnection") + + If bolReplaced Then + + SetModulCopyControls "CopyModulAccUtil", True + SetModulCopyControls "CopyModulDbConnectionHandler", True + SetModulCopyControls "CopyModulDbConnectionInfo", True + SetModulCopyControls "CopyModules", True + + If m_OpenModules = 0 Then + MsgBox "Modules and classes updated" + End If + + m_OpenModules = 0 + + End If + +End Sub + +Private Sub RefreshCodeModulesFromSccRepo(ByVal UseDraft As Boolean) + + With New ACLibGitHubImporter + + .UseDraftBranch = UseDraft + + If .LastCommit(True) = SccRevMin Then + If MsgBox("All modules are already up to date." & vbNewLine & _ + "Do you still want to re-import?", vbYesNo + vbDefaultButton2, CurrentApplication.ApplicationName) <> vbYes Then + Exit Sub + End If + End If + + .UpdateCodeModules + + End With + + MsgBox "Codemodules have been updated.", , CurrentApplication.ApplicationName + + SetFormCaption + +End Sub + +Private Sub labCopyCaption_MouseDown(Button As Integer, Shift As Integer, X As Single, Y As Single) +On Error GoTo HandleErr + + If Button = 1 Or Button = 2 Then + OpenReplaceModulesContextMenu Me.labCopyCaption, X, Y + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub CheckModules() + + Dim checkOk As Boolean + +On Error Resume Next + + m_OpenModules = 0 + + With CodeModulImporter + checkOk = .CheckCodeModules("SqlTools", "defDbConnection", "DbConnectionInfo") + m_OpenModules = m_OpenModules + 1 + checkOk + SetModulCopyControls "CopyModulDbConnectionInfo", checkOk + + checkOk = .CheckCodeModules("AdodbHandler", "DaoHandler", "OdbcHandler", "DbConnectionHandler") + m_OpenModules = m_OpenModules + 1 + checkOk + SetModulCopyControls "CopyModulDbConnectionHandler", checkOk + + checkOk = .CheckCodeModules("DbConnectionSettings", "DbConnectionManager", "modDbConnection") + m_OpenModules = m_OpenModules + 1 + checkOk + SetModulCopyControls "CopyModulAccUtil", checkOk + + checkOk = (m_OpenModules = 0) + SetModulCopyControls "CopyModules", checkOk + End With + +End Sub + +Private Property Get CodeModulImporter() As AppFileCodeModulTransfer + If m_CodeModulImporter Is Nothing Then + Set m_CodeModulImporter = New AppFileCodeModulTransfer + m_CodeModulImporter.UseVbComponentsImport = APPLICATION_FILTERCODEMODULE_USEVBCOMPONENTSIMPORT + End If + Set CodeModulImporter = m_CodeModulImporter +End Property + +Private Sub cmdCopyModulAccUtil_Click() +On Error GoTo HandleErr + + CodeModulImporter.TransferCodeModules "DbConnectionSettings", "DbConnectionManager", "modDbConnection" + m_OpenModules = m_OpenModules - 1 + If Not CheckCodeModules("AdodbHandler", "DaoHandler", "OdbcHandler", "DbConnectionHandler") Then + cmdCopyModulDbConnectionHandler_Click + End If + SetModulCopyControls "CopyModulAccUtil", True + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdCopyModulDbConnectionHandler_Click() +On Error GoTo HandleErr + + CodeModulImporter.TransferCodeModules "AdodbHandler", "DaoHandler", "OdbcHandler", "DbConnectionHandler" + m_OpenModules = m_OpenModules - 1 + If Not CheckCodeModules("defDbConnection", "DbConnectionInfo") Then + cmdCopyModulDbConnectionInfo_Click + End If + SetModulCopyControls "CopyModulDbConnectionHandler", True + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdCopyModulDbConnectionInfo_Click() +On Error GoTo HandleErr + + CheckConditionalCompilationArgumentsString Me.cbUseLoginForm + CheckLoginForm + CodeModulImporter.TransferCodeModules "SqlTools", "defDbConnection", "DbConnectionInfo" + m_OpenModules = m_OpenModules - 1 + SetModulCopyControls "CopyModulDbConnectionInfo", True + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdCopyModules_Click() +On Error GoTo HandleErr + + CheckConditionalCompilationArgumentsString Me.cbUseLoginForm + CheckLoginForm + + CodeModulImporter.TransferCodeModules "SqlTools", "defDbConnection", "DbConnectionInfo", "AdodbHandler", "DaoHandler", "OdbcHandler", "DbConnectionHandler", "DbConnectionSettings", "DbConnectionManager", "modDbConnection" + SetModulCopyControls "CopyModulAccUtil", True + SetModulCopyControls "CopyModulDbConnectionHandler", True + SetModulCopyControls "CopyModulDbConnectionInfo", True + SetModulCopyControls "CopyModules", True + m_OpenModules = 0 + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub SetModulCopyControls(ByVal sModulCode As String, ByVal bExists As Boolean) + + Dim sCaption As String + Dim lBorderStyle As Long + +On Error Resume Next + + If bExists Then Me.sysFirst.SetFocus + Me.Controls("cmd" & sModulCode).Enabled = Not bExists + If bExists Then + sCaption = "b" + lBorderStyle = 0 + Else + sCaption = vbNullString + lBorderStyle = 1 + End If + With Me.Controls("lab" & sModulCode) + .Caption = sCaption + .BorderStyle = lBorderStyle + End With + + If sModulCode <> "CopyModules" And m_OpenModules = 0 Then + SetModulCopyControls "CopyModules", True + End If + +End Sub + +Private Sub SetFormCaption() +On Error Resume Next + Me.Parent.SetFormCaption +End Sub diff --git a/source/forms/frmConfig_DBMS_SF_Data.form b/source/forms/frmConfig_DBMS_SF_Data.form new file mode 100644 index 0000000..07c00f5 --- /dev/null +++ b/source/forms/frmConfig_DBMS_SF_Data.form @@ -0,0 +1,1135 @@ +Version =20 +VersionRequired =20 +Begin Form + AllowFilters = NotDefault + RecordSelectors = NotDefault + ShortcutMenu = NotDefault + AutoCenter = NotDefault + NavigationButtons = NotDefault + AllowDeletions = NotDefault + AllowAdditions = NotDefault + KeyPreview = NotDefault + DefaultView =0 + ScrollBars =0 + TabularFamily =119 + PictureAlignment =2 + DatasheetGridlinesBehavior =3 + Cycle =1 + GridY =10 + Width =11597 + DatasheetFontHeight =10 + ItemSuffix =88 + Top =1000 + Right =50000 + Bottom =50000 + OnUnload ="[Event Procedure]" + RecSrcDt = Begin + 0xe79e74fdce00e640 + End + RecordSource ="SELECT NULL AS CID, NULL AS ActiveConnection, NULL AS DBMS, NULL AS dbmsConnecti" + "onMode, NULL AS dbmsOleDbProvider, NULL AS dbmsOdbcDriver, NULL AS dbmsServer, N" + "ULL AS dbmsPort, NULL AS dbmsDatabase, NULL AS dbmsEnabled, NULL AS dbmsUseTrust" + "edConnection, NULL AS dbmsUseLoginForm, NULL AS dbmsUser, NULL AS dbmsPwd, NULL " + "AS dbmsOptionsODBC, NULL AS dbmsOptionsOLEDB, NULL AS dbmsDSN, NULL AS dbmsConSt" + "rODBC, NULL AS dbmsConStrOLEDB, NULL AS Remarks, NULL AS XdbmsConnectionModes, N" + "ULL AS XdbmsServer, NULL AS XdbmsPort, NULL AS XdbmsDatabase, NULL AS XdbmsUseLo" + "ginForm, NULL AS XdbmsUseTrustedConnection, NULL AS XdbmsUser, NULL AS XdbmsPwd," + " NULL AS XdbmsOptionsODBC, NULL AS XdbmsOptionsOLEDB, NULL AS XdbmsDSN, NULL AS " + "XdbmsConStrODBC, NULL AS XdbmsConStrOLEDB, NULL AS XdbmsOledbProvider, NULL AS X" + "dbmsOdbcDriver, NULL AS DriverODBC, NULL AS DriverOLEDB FROM tab1DS WHERE 1=0; " + OnCurrent ="[Event Procedure]" + AfterUpdate ="[Event Procedure]" + DatasheetFontName ="Arial" + OnKeyDown ="[Event Procedure]" + OnLoad ="[Event Procedure]" + FilterOnLoad =0 + OrderByOnLoad =0 + OrderByOnLoad =0 + ShowPageMargins =0 + AllowLayoutView =0 + DatasheetGridlinesColor12 =12632256 + Begin + Begin Label + BackStyle =0 + FontName ="Tahoma" + End + Begin Rectangle + SpecialEffect =3 + BackStyle =0 + BorderLineStyle =0 + Width =850 + Height =850 + End + Begin Line + BorderLineStyle =0 + Width =1701 + End + Begin CommandButton + Width =1701 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin CheckBox + SpecialEffect =2 + BorderLineStyle =0 + LabelX =230 + LabelY =-30 + End + Begin OptionGroup + SpecialEffect =3 + BorderLineStyle =0 + Width =1701 + Height =1701 + End + Begin TextBox + FELineBreak = NotDefault + SpecialEffect =2 + OldBorderStyle =0 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + AsianLineBreak =255 + End + Begin ComboBox + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + End + Begin ToggleButton + Width =283 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin Section + Height =7661 + BackColor =-2147483633 + Name ="Detailbereich" + Begin + Begin Label + OldBorderStyle =1 + BorderWidth =1 + OverlapFlags =93 + TextFontCharSet =2 + TextAlign =1 + TextFontFamily =2 + Left =10935 + Top =1875 + Width =295 + Height =295 + FontSize =16 + ForeColor =5026082 + Name ="labCopyModulDbConnectionHandler" + FontName ="Marlett" + OnClick ="[Event Procedure]" + End + Begin Label + OldBorderStyle =1 + BorderWidth =1 + OverlapFlags =93 + TextFontCharSet =2 + TextAlign =1 + TextFontFamily =2 + Left =10935 + Top =1515 + Width =295 + Height =295 + FontSize =16 + ForeColor =5026082 + Name ="labCopyModulDbConnectionInfo" + FontName ="Marlett" + End + Begin Label + OldBorderStyle =1 + BorderWidth =1 + OverlapFlags =93 + TextFontCharSet =2 + TextAlign =1 + TextFontFamily =2 + Left =10935 + Top =2235 + Width =295 + Height =295 + FontSize =16 + ForeColor =5026082 + Name ="labCopyModulAccUtil" + FontName ="Marlett" + End + Begin Label + OldBorderStyle =1 + BorderWidth =1 + OverlapFlags =93 + TextFontCharSet =2 + TextAlign =1 + TextFontFamily =2 + Left =10935 + Top =1170 + Width =295 + Height =295 + FontSize =16 + ForeColor =5026082 + Name ="labCopyModules" + FontName ="Marlett" + End + Begin Line + OverlapFlags =93 + SpecialEffect =2 + Left =6251 + Top =403 + Width =0 + Height =7258 + Name ="Linie49" + End + Begin Rectangle + SpecialEffect =1 + BackStyle =1 + OldBorderStyle =0 + OverlapFlags =223 + Left =30 + Top =30 + Width =11567 + Height =397 + BackColor =-2147483633 + Name ="rectHeader" + OnMouseDown ="[Event Procedure]" + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =83 + IMESentenceMode =3 + Left =1254 + Top =1522 + Width =3510 + Height =270 + FontSize =9 + TabIndex =9 + ForeColor =8421504 + Name ="txtDbmsServer" + ControlSource ="dbmsServer" + StatusBarText ="Name or IP address of the database server (for MSSQL incl. instance identifier)" + Tag ="LANG:" + UnicodeAccessKey =83 + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =1522 + Width =1134 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld22" + Caption ="&Server:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =68 + IMESentenceMode =3 + Left =1254 + Top =1125 + Width =4151 + Height =270 + ColumnWidth =1485 + FontSize =9 + TabIndex =8 + LeftMargin =29 + Name ="txtDbmsDatabase" + ControlSource ="dbmsDatabase" + StatusBarText ="Database name in the server; for JET: = complete path to the BE" + Tag ="LANG:" + UnicodeAccessKey =68 + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =1132 + Width =1134 + Height =255 + FontSize =9 + FontWeight =700 + Name ="labDatabase" + Caption ="mdb-&Datei:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =85 + IMESentenceMode =3 + Left =1254 + Top =1927 + Width =2370 + Height =270 + FontSize =9 + TabIndex =11 + ForeColor =8421504 + Name ="txtDbmsUser" + ControlSource ="dbmsUser" + StatusBarText ="Name of the database user" + Tag ="LANG:" + UnicodeAccessKey =85 + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =1927 + Width =1134 + Height =255 + FontSize =9 + Name ="labDbmsUser" + Caption ="&User:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =80 + IMESentenceMode =3 + Left =1254 + Top =2317 + Width =2370 + Height =270 + FontSize =9 + TabIndex =13 + ForeColor =8421504 + Name ="txtDbmsPwd" + ControlSource ="dbmsPwd" + StatusBarText ="Password of the user. As soon as a password is available, the tables incl. passw" + "ord are linked. If this is not desired, the login form should be used." + Tag ="LANG:" + UnicodeAccessKey =80 + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =2317 + Width =1134 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld25" + Caption ="&Password:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =79 + IMESentenceMode =3 + Left =1254 + Top =4950 + Width =4876 + Height =270 + ColumnWidth =2430 + FontSize =9 + TabIndex =19 + ForeColor =8421504 + Name ="txtDbmsOptionsODBC" + ControlSource ="dbmsOptionsODBC" + StatusBarText ="Appended after the ODBC connection string created by code." + Tag ="LANG:" + UnicodeAccessKey =79 + + Begin + Begin Label + OverlapFlags =93 + Left =132 + Top =4950 + Width =1134 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld26" + Caption ="&ODBC:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =76 + IMESentenceMode =3 + Left =1254 + Top =4605 + Width =4876 + Height =270 + ColumnWidth =2565 + FontSize =9 + TabIndex =18 + ForeColor =8421504 + Name ="txtDbmsOptionsOLEDB" + ControlSource ="dbmsOptionsOLEDB" + StatusBarText ="Appended after the OLEDB connection string created by code." + Tag ="LANG:" + UnicodeAccessKey =76 + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =4605 + Width =1134 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld27" + Caption ="O&LEDB:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + AccessKey =78 + IMESentenceMode =3 + Left =1254 + Top =2714 + Width =4876 + Height =270 + FontSize =9 + TabIndex =15 + ForeColor =8421504 + Name ="txtDbmsDSN" + ControlSource ="dbmsDSN" + StatusBarText ="Use saved DSN (only works for ODBC connection)" + Tag ="LANG:" + UnicodeAccessKey =78 + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =2714 + Width =1134 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld28" + Caption ="DS&N:" + End + End + End + Begin Label + OverlapFlags =85 + Left =127 + Top =3157 + Width =6024 + Height =255 + FontSize =9 + FontWeight =700 + Name ="labProviderDriver" + Caption ="Provider / Driver:" + ControlTipText ="Möglichkeit einen alternativen Treiber einzustellen" + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + BackStyle =0 + IMESentenceMode =3 + Width =0 + Height =0 + Name ="sysFirst" + + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =85 + TextAlign =2 + IMESentenceMode =3 + Left =5521 + Top =1522 + Width =615 + Height =270 + FontSize =9 + TabIndex =10 + Name ="txtDbmsPort" + ControlSource ="dbmsPort" + StatusBarText ="Port" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =3 + Left =4889 + Top =1522 + Width =549 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld34" + Caption ="Port:" + End + End + End + Begin Label + OverlapFlags =85 + Left =127 + Top =5417 + Width =6024 + Height =255 + FontSize =9 + FontWeight =700 + Name ="Bezeichnungsfeld35" + Caption ="Custom ConnectionString:" + Tag ="LANG:" + ControlTipText ="Ignore all settings and set the connection string manually." + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + IMESentenceMode =3 + Left =1240 + Top =6689 + Width =4876 + Height =840 + TabIndex =21 + LeftMargin =29 + ForeColor =9868950 + Name ="txtDbmsConStrODBC" + ControlSource ="dbmsConStrODBC" + Format ="@;\"Only fill in if ConnectionString is not to be generated by code.\"" + StatusBarText ="Custom ODBC connection string (connection string is not created by code)" + Tag ="LANG:" + + Begin + Begin Label + OverlapFlags =93 + Left =113 + Top =6689 + Width =1125 + Height =240 + Name ="Bezeichnungsfeld37" + Caption ="ODBC:" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + OverlapFlags =87 + IMESentenceMode =3 + Left =1254 + Top =5745 + Width =4876 + Height =841 + TabIndex =20 + LeftMargin =29 + ForeColor =9868950 + Name ="txtDbmsConStrOLEDB" + ControlSource ="dbmsConStrOLEDB" + Format ="@;\"Only fill in if ConnectionString is not to be generated by code.\"" + StatusBarText ="Custom OLEDB connection string (connection string is not created by code)" + Tag ="LANG:" + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =5745 + Width =1140 + Height =240 + Name ="Bezeichnungsfeld39" + Caption ="OLEDB:" + End + End + End + Begin CheckBox + OverlapFlags =85 + Left =5862 + Top =2378 + Height =225 + TabIndex =14 + Name ="cbUseLoginForm" + ControlSource ="dbmsUseLoginForm" + StatusBarText ="Aktiviert das Login-Formular zur Anmeldung in die Datenbank" + AfterUpdate ="[Event Procedure]" + DefaultValue ="0" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =3 + Left =3690 + Top =2333 + Width =2145 + Height =240 + Name ="Bezeichnungsfeld44" + Caption ="Use Login Form:" + Tag ="LANG:" + End + End + End + Begin CheckBox + OverlapFlags =85 + Left =5862 + Top =1972 + Height =225 + TabIndex =12 + Name ="cbTrustedConnection" + ControlSource ="dbmsUseTrustedConnection" + StatusBarText ="Windows-Authentifizierung verwenden" + AfterUpdate ="[Event Procedure]" + DefaultValue ="0" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =3 + Left =3675 + Top =1920 + Width =2160 + Height =240 + Name ="Bezeichnungsfeld48" + Caption ="Windows Authentification:" + Tag ="LANG:" + End + End + End + Begin TextBox + EnterKeyBehavior = NotDefault + AllowAutoCorrect = NotDefault + ScrollBars =2 + OverlapFlags =93 + AccessKey =77 + IMESentenceMode =3 + Left =6349 + Top =3480 + Width =5103 + Height =4049 + ColumnWidth =3930 + FontSize =9 + TabIndex =6 + Name ="txtRemarks" + ControlSource ="Remarks" + + End + Begin TextBox + Locked = NotDefault + TabStop = NotDefault + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =215 + IMESentenceMode =3 + Left =120 + Top =56 + Width =3171 + Height =315 + FontSize =11 + FontWeight =700 + TabIndex =1 + BackColor =-2147483633 + BorderColor =8421504 + ForeColor =128 + Name ="txtCID" + ControlSource ="CID" + Format ="@;\" \"" + StatusBarText ="Connection identifier (double click to edit)" + AfterUpdate ="[Event Procedure]" + OnDblClick ="[Event Procedure]" + OnMouseDown ="[Event Procedure]" + Tag ="LANG:" + ControlTipText ="Connection identifier (double click to edit)" + + End + Begin CheckBox + TabStop = NotDefault + OverlapFlags =215 + AccessKey =65 + Left =11322 + Top =120 + TabIndex =4 + Name ="cbActiveConnection" + ControlSource ="ActiveConnection" + AfterUpdate ="[Event Procedure]" + UnicodeAccessKey =97 + + Begin + Begin Label + OverlapFlags =215 + TextAlign =3 + Left =9803 + Top =90 + Width =1492 + Height =240 + FontWeight =700 + Name ="Bezeichnungsfeld21" + Caption ="en&abled" + Tag ="LANG:" + End + End + End + Begin Label + OverlapFlags =87 + Left =6349 + Top =3157 + Width =5100 + Height =313 + FontSize =9 + LeftMargin =14 + Name ="labCaptionRemarks" + Caption ="Remarks:" + Tag ="LANG:" + End + Begin Label + OverlapFlags =85 + Left =120 + Top =4275 + Width =6024 + Height =255 + FontSize =9 + FontWeight =700 + Name ="Bezeichnungsfeld51" + Caption ="Other options:" + Tag ="LANG:" + ControlTipText ="Additional information for the connection strings generated in the DbConnectionI" + "nfo class. \012The entries are appended to the end of the generated connection s" + "trings." + End + Begin CommandButton + TabStop = NotDefault + OverlapFlags =85 + Left =5505 + Top =1095 + Width =638 + Height =381 + TabIndex =7 + Name ="cmdSelectFile" + Caption ="Befehl52" + OnClick ="[Event Procedure]" + PictureData = Begin + 0x2800000010000000100000000100040000000000800000000000000000000000 , + 0x0000000000000000000000000000800000800000008080008000000080008000 , + 0x8080000080808000c0c0c0000000ff00c0c0c00000ffff00ff000000c0c0c000 , + 0xffff0000ffffff00dadadadadadadadaadadadadadadadad00000000000adada , + 0x003333333330adad0b03333333330ada0fb03333333330ad0bfb03333333330a , + 0x0fbfb000000000000bfbfbfbfb0adada0fbfbfbfbf0dadad0bfb0000000adada , + 0xa000adadadad000ddadadadadadad00aadadadad0dad0d0ddadadadad000dada , + 0xadadadadadadadad000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000 + End + ObjectPalette = Begin + 0x000301000000000000000000 + End + ControlTipText ="Datei auswählen" + + End + Begin CommandButton + TabStop = NotDefault + OverlapFlags =215 + AccessKey =67 + Left =6345 + Top =75 + Width =2099 + TabIndex =3 + Name ="cmdCheckConnection" + Caption ="&Check Connection" + OnClick ="[Event Procedure]" + Tag ="LANG:" + UnicodeAccessKey =67 + + Overlaps =1 + End + Begin OptionGroup + OverlapFlags =85 + Left =113 + Top =510 + Width =6036 + Height =507 + TabIndex =5 + Name ="ogDbmsConnectionMode" + ControlSource ="dbmsConnectionMode" + StatusBarText ="Art der Verbindung" + AfterUpdate ="[Event Procedure]" + DefaultValue ="0" + + Begin + Begin ToggleButton + OverlapFlags =87 + Left =225 + Top =600 + Width =1871 + Height =340 + OptionValue =1 + Name ="optDbmsConnectionMode1" + Caption ="dsn less" + Tag ="LANG:" + + End + Begin ToggleButton + OverlapFlags =87 + Left =2205 + Top =600 + Width =1871 + Height =340 + TabIndex =1 + OptionValue =2 + Name ="optDbmsConnectionMode2" + Caption ="use DSN" + Tag ="LANG:" + + End + Begin ToggleButton + OverlapFlags =87 + Left =4200 + Top =600 + Width =1871 + Height =340 + TabIndex =2 + OptionValue =4 + Name ="optDbmsConnectionMode4" + Caption ="custom" + Tag ="LANG:" + + End + End + End + Begin Label + OverlapFlags =215 + Left =3405 + Top =56 + Width =735 + Height =315 + FontSize =11 + Name ="labDbmsCaption" + Caption ="DBMS:" + OnMouseDown ="[Event Procedure]" + End + Begin ComboBox + LimitToList = NotDefault + Visible = NotDefault + SpecialEffect =0 + OverlapFlags =223 + IMESentenceMode =3 + Left =4195 + Top =56 + Width =1972 + Height =315 + FontSize =11 + FontWeight =700 + TabIndex =22 + BackColor =-2147483633 + BorderColor =8421504 + Name ="cbxDBMS" + ControlSource ="DBMS" + RowSourceType ="Table/Query" + StatusBarText ="DBMS-Kennung" + AfterUpdate ="[Event Procedure]" + OnEnter ="[Event Procedure]" + OnMouseDown ="[Event Procedure]" + + End + Begin TextBox + Locked = NotDefault + TabStop = NotDefault + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =247 + IMESentenceMode =3 + Left =4195 + Top =56 + Width =1986 + Height =315 + FontSize =11 + FontWeight =700 + TabIndex =2 + BackColor =-2147483633 + Name ="txtDBMS" + ControlSource ="DBMS" + OnMouseDown ="[Event Procedure]" + OnGotFocus ="[Event Procedure]" + + End + Begin CommandButton + Enabled = NotDefault + OverlapFlags =85 + Left =6349 + Top =566 + Width =2100 + Height =397 + FontSize =9 + TabIndex =23 + Name ="cmdLinkTables" + Caption ="Link tables" + OnClick ="[Event Procedure]" + Tag ="LANG:" + + End + Begin CommandButton + Enabled = NotDefault + OverlapFlags =85 + Left =8787 + Top =566 + Width =2160 + Height =397 + FontSize =9 + TabIndex =24 + Name ="cmdTestSQL" + Caption ="Test SQL statement" + OnClick ="[Event Procedure]" + Tag ="LANG:" + + End + Begin Label + OverlapFlags =85 + Left =6585 + Top =1545 + Width =4286 + Height =255 + FontSize =9 + Name ="labCaptionCopyModulDbConnectionInfo" + Caption ="DbConnectionInfo" + End + Begin Label + OverlapFlags =85 + Left =6585 + Top =1905 + Width =4286 + Height =255 + FontSize =9 + Name ="labCaptionCopyModulDbConnectionHandler" + Caption ="DbConnectionHandler + DAO/ADO/ODBC-Handler" + End + Begin Label + OverlapFlags =85 + Left =6585 + Top =2265 + Width =4286 + Height =255 + FontSize =9 + Name ="labCaptionCopyModulAccUtil" + Caption ="DbConnectionManager + modDbConnection" + End + Begin CommandButton + Transparent = NotDefault + OverlapFlags =215 + Left =10935 + Top =1875 + Width =295 + Height =295 + TabIndex =25 + Name ="cmdCopyModulDbConnectionHandler" + Caption ="Befehl69" + OnClick ="[Event Procedure]" + + Overlaps =1 + End + Begin CommandButton + Transparent = NotDefault + OverlapFlags =215 + Left =10935 + Top =1515 + Width =295 + Height =295 + TabIndex =26 + Name ="cmdCopyModulDbConnectionInfo" + Caption ="Befehl69" + OnClick ="[Event Procedure]" + + Overlaps =1 + End + Begin CommandButton + Transparent = NotDefault + OverlapFlags =215 + Left =10935 + Top =2235 + Width =295 + Height =295 + TabIndex =27 + Name ="cmdCopyModulAccUtil" + Caption ="Befehl69" + OnClick ="[Event Procedure]" + + Overlaps =1 + End + Begin CommandButton + Transparent = NotDefault + OverlapFlags =215 + Left =10935 + Top =1170 + Width =295 + Height =295 + TabIndex =28 + Name ="cmdCopyModules" + Caption ="Befehl69" + OnClick ="[Event Procedure]" + + Overlaps =1 + End + Begin CommandButton + Visible = NotDefault + OverlapFlags =85 + Left =11168 + Top =566 + Width =330 + Height =397 + TabIndex =29 + Name ="cmdHelp" + Caption ="Befehl86" + OnClick ="[Event Procedure]" + PictureData = Begin + 0x2800000010000000100000000100040000000000800000000000000000000000 , + 0x0000000000000000000000000000800000800000008080008000000080008000 , + 0x8080000080808000c0c0c0000000ff00c0c0c00000ffff00ff000000c0c0c000 , + 0xffff0000ffffff00dadadadadadadadaadadadadadadadaddadadad000dadada , + 0xadadad0bb00dadaddadada0bb00adadaadadada00dadadaddadada0b00dadada , + 0xadadad0b00adadaddadada0b00dadadaadadad0bb00dadaddada00d0bb00dada , + 0xada0b00d0bb00daddad0b00ad0b00adaada0bb000bb00daddada0bbbbb00dada , + 0xadada000000dadad000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x0000000000000000 + End + ObjectPalette = Begin + 0x000301000000000000000000 + End + + End + Begin ComboBox + OldBorderStyle =0 + OverlapFlags =87 + IMESentenceMode =3 + Left =1254 + Top =3480 + Width =4876 + Height =255 + ColumnWidth =2010 + FontSize =9 + TabIndex =16 + ForeColor =8421504 + ConditionalFormat = Begin + 0x0100000068000000010000000000000004000000000000000300000001000000 , + 0x00000000ffffff00000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x2200220000000000 + End + Name ="txtDbmsOleDbProvider" + ControlSource ="dbmsOleDbProvider" + RowSourceType ="Table/Query" + StatusBarText ="Select OLEDB Provider" + OnEnter ="[Event Procedure]" + OnExit ="[Event Procedure]" + OnDblClick ="[Event Procedure]" + Tag ="LANG:" + Format ="@;;" + + Begin + Begin Label + OverlapFlags =93 + Left =120 + Top =3480 + Width =1140 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld45" + Caption ="OLEDB:" + End + End + End + Begin ComboBox + OldBorderStyle =0 + OverlapFlags =215 + IMESentenceMode =3 + Left =1254 + Top =3820 + Width =4876 + Height =255 + ColumnWidth =1995 + FontSize =9 + TabIndex =17 + ForeColor =8421504 + ConditionalFormat = Begin + 0x0100000068000000010000000000000004000000000000000300000001000000 , + 0x00000000ffffff00000000000000000000000000000000000000000000000000 , + 0x0000000000000000000000000000000000000000000000000000000000000000 , + 0x2200220000000000 + End + Name ="txtDbmsOdbcDriver" + ControlSource ="dbmsOdbcDriver" + RowSourceType ="Table/Query" + StatusBarText ="Select ODBC Driver" + OnEnter ="[Event Procedure]" + OnExit ="[Event Procedure]" + Tag ="LANG:" + Format ="@;;" + + Begin + Begin Label + OverlapFlags =93 + Left =132 + Top =3820 + Width =1140 + Height =255 + FontSize =9 + Name ="Bezeichnungsfeld46" + Caption ="ODBC:" + End + End + End + Begin Label + FontUnderline = NotDefault + OverlapFlags =85 + Left =6349 + Top =1132 + Width =3000 + Height =255 + FontSize =9 + FontWeight =700 + ForeColor =16737792 + Name ="labCopyCaption" + Caption ="Install modules and classes:" + OnMouseDown ="[Event Procedure]" + OnMouseMove ="[Event Procedure]" + Tag ="LANG:" + VerticalAnchor =1 + End + End + End + End +End +CodeBehindForm +' See "frmConfig_DBMS_SF_Data.cls" diff --git a/source/forms/frmConfig_DBMS_SF_Data.json b/source/forms/frmConfig_DBMS_SF_Data.json new file mode 100644 index 0000000..55b1a92 --- /dev/null +++ b/source/forms/frmConfig_DBMS_SF_Data.json @@ -0,0 +1,190 @@ +{ + "Info": { + "Class": "clsDbForm", + "Description": "frmConfig_DBMS_SF_Data Print Settings" + }, + "Items": { + "Printer": { + "Orientation": "Portrait", + "PaperSize": "A4" + }, + "Margins": { + "LeftMargin": 1.0097, + "TopMargin": 1.0097, + "RightMargin": 1.0097, + "BotMargin": 1.0097, + "DataOnly": false, + "Width": 5, + "Height": 3, + "DefaultSize": true, + "Columns": 1, + "ColumnSpacing": 0.25, + "RowSpacing": 0, + "ItemLayout": "Horizontal Columns", + "FastPrint": 1, + "Datasheet": 1 + }, + "ConditionalFormatting": { + "txtDbmsServer": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsUser": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsPwd": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsOptionsODBC": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsOptionsOLEDB": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsDSN": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsConStrODBC": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsConStrOLEDB": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsOleDbProvider": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtDbmsOdbcDriver": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + } + } + } +} diff --git a/source/forms/frmConfig_LinkTables.cls b/source/forms/frmConfig_LinkTables.cls new file mode 100644 index 0000000..e055a93 --- /dev/null +++ b/source/forms/frmConfig_LinkTables.cls @@ -0,0 +1,656 @@ +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Compare Text +Option Explicit + +Private Const m_Caption As String = "Config Linked Tables" +Private Const m_DoEventCounter As Long = 1 'Anzahl der zu aktualisierenden Tabellen bis Event "DbObjectRelinked" bzw. "DbObjectDeleted" ausgelöst wird + +Private WithEvents m_OdbcHandler As OdbcHandler +Attribute m_OdbcHandler.VB_VarHelpID = -1 +Private m_CalledByWizard As Boolean + +Private m_OdbcHandlerEventBridge As OdbcHandlerEventBridge +Private WithEvents m_L10nDict As L10nDict +Attribute m_L10nDict.VB_VarHelpID = -1 + +Private Sub cbSelectAll_AfterUpdate() + + Dim bolSelectAll As Boolean +On Error GoTo HandleErr + + bolSelectAll = (Me.cbSelectAll.Value = True) + + ListEnableMode = Not bolSelectAll + + If Not bolSelectAll Then + listLinkedTableNames + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + + +Private Property Let ListEnableMode(ByVal bEnabled As Boolean) + + Me.lstLinkedTabNames.Enabled = bEnabled + + If bEnabled Then + Me.labFilter.ForeColor = &H7D491F + Else + Me.labFilter.ForeColor = &HDED1C6 + If Nz(Me.cbxFilterObjectType.Value, 3) <> 3 Or Len(Me.txtFilterObjectName.Value) > 0 Then + Me.cbxFilterObjectType.Value = 3 + Me.txtFilterObjectName.Value = Null + listLinkedTableNames + End If + End If + + Me.cbxFilterObjectType.Enabled = bEnabled + Me.txtFilterObjectName.Enabled = bEnabled + Me.cmdUseFilter.Enabled = bEnabled + + ' +End Property + +Private Sub cbxFilterObjectType_KeyDown(KeyCode As Integer, Shift As Integer) + +On Error GoTo HandleErr + + If KeyCode = vbKeyReturn Then + listLinkedTableNames + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdDeleteLinkedTables_Click() + +On Error GoTo HandleErr + + If Me.cbSelectAll.Value = True Then + If MsgBox("Should all linked tables be deleted?" & vbNewLine & _ + "(The tables are removed only in the frontend.)", vbYesNo) = vbYes Then + StartDeleteOdbcTableDefs + End If + Else + If MsgBox("Should the selected tables be deleted?" & vbNewLine & _ + "(The tables are removed only in the frontend.)", vbYesNo) = vbYes Then + DeleteSelectedTabs + End If + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdLinkTables_Click() + +On Error GoTo HandleErr + + Select Case ogLinkMode.Value + Case 1 'manuell + LinkTextboxTable + Case 2 'listbox + LinkSelectedTables + Case Else + 'nicht möglich + End Select + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub cmdReconnect_Click() +On Error GoTo HandleErr + + StartReconnectOdbc + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub cmdUseFilter_Click() +On Error GoTo HandleErr + + listLinkedTableNames + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub Form_Load() +On Error GoTo HandleErr + + Me.Section(acDetail).BackColor = dcwBackgroundForm + listLinkedTableNames + Me.Caption = m_Caption + + If Len(Me.OpenArgs) > 0 Then + m_CalledByWizard = True + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox + +End Sub + +Private Sub Form_Open(Cancel As Integer) + L10n.TranslateControls Me.Controls + Set m_L10nDict = L10n +End Sub + +Private Sub Form_Timer() +On Error Resume Next + Me.labCompletionInfo.Visible = False +End Sub + +Private Sub Form_Unload(Cancel As Integer) +On Error Resume Next + If Not m_CalledByWizard Then + DisposeWizard + End If + Set m_L10nDict = Nothing +End Sub + +Private Sub m_OdbcHandler_DbObjectRelinked(ByVal LastDbObjectName As String, ByVal lCounter As Long) +On Error GoTo HandleErr + + Me.txtLastObjectName.Value = LastDbObjectName + Me.txtObjectCounter.Value = lCounter + DoEvents 'erforderlich, damit Änderungen sichtbar werden + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + + +Private Sub m_OdbcHandler_DbObjectDeleted(ByVal LastDbObjectName As String, ByVal lCounter As Long) +On Error GoTo HandleErr + + Me.txtLastObjectName.Value = LastDbObjectName + Me.txtObjectCounter.Value = lCounter + DoEvents + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub ogLinkMode_AfterUpdate() +On Error GoTo HandleErr + + RefreshDbmsTableNamesList + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub RefreshDbmsTableNamesList() + Dim lngLinkMode As Long + + lngLinkMode = Nz(ogLinkMode.Value, 0) + Me.txtTabName.Enabled = (lngLinkMode = 1) + Me.lstTabNames.Enabled = (lngLinkMode = 2) + + Select Case lngLinkMode + Case 1 'manuell + Me.txtTabName.SetFocus + Case 2 'listbox + listDbmsTableNames + Case Else + 'nicht möglich + End Select +End Sub + +Private Sub listDbmsTableNames() + + Const conQdfNameSourceTableList As String = "usys_DbmsTableNames" + Dim db As DAO.Database + Dim qdf As DAO.QueryDef + Dim strDbmsName As String + Dim strOdbcConnectionString As String + Dim strTableListSqlText As String + Dim strSQL As String + + strDbmsName = CurrentConnectionInfo.DbmsName + strTableListSqlText = CurrentConnectionInfo.TableListSqlText + If Not CheckListDbmsTableMode() Then + InsertTablesFromAdoSchemaTables + Exit Sub + End If + + strOdbcConnectionString = CurrentConnectionInfo.OdbcConnectionString + + Set db = CodeDb 'AddIn zum Speichern des QDF verwenden + If QueryDefExists(conQdfNameSourceTableList, db) Then + Set qdf = db.QueryDefs(conQdfNameSourceTableList) + Else + Set qdf = db.CreateQueryDef(conQdfNameSourceTableList) + End If + qdf.SQL = "select 1 as x" + If StrComp(strDbmsName, "MSJET", vbTextCompare) = 0 Then + qdf.Connect = vbNullString + Else + qdf.Connect = strOdbcConnectionString + End If + qdf.SQL = strTableListSqlText + qdf.ReturnsRecords = True + + + Dim strFilter As String + strFilter = GetDbmsTableListFilter("T.") + + strSQL = "select NULL AS TABLE_CATALOG, T.TABLE_SCHEMA, T.TABLE_NAME from " & conQdfNameSourceTableList & " AS T" & _ + " left join (select ForeignName FROM [" & CurrentDb.Name & "].MSysObjects WHERE Type = 4) O ON O.ForeignName = T.TabKey" & _ + " where O.ForeignName IS NULL" + + If Len(strFilter) > 0 Then + strSQL = strSQL & " AND " & strFilter + End If + + Me.lstTabNames.RowSource = strSQL + +End Sub + +Private Sub InsertTablesFromAdoSchemaTables() + Dim cnn As ADODB.Connection + Dim rst As ADODB.Recordset + + Set cnn = New ADODB.Connection + cnn.ConnectionString = CurrentConnectionInfo.OledbConnectionString + cnn.CursorLocation = adUseClient + cnn.Open + + 'TABLE_CATALOG TABLE_SCHEMA TABLE_NAME TABLE_TYPE TABLE_GUID DESCRIPTION TABLE_PROPID DATE_CREATED DATE_MODIFIED + Set rst = cnn.OpenSchema(adSchemaTables, _ + Array(Empty, Empty, Empty, Empty)) + Set rst.ActiveConnection = Nothing + cnn.Close + Set cnn = Nothing + + Dim strFilter As String + strFilter = GetDbmsTableListFilter + If Len(strFilter) > 0 Then + rst.Filter = strFilter + End If + + Set Me.lstTabNames.Recordset = rst + +End Sub + +Private Function GetDbmsTableListFilter(Optional SourcePrefix As String = vbNullString) As String + + Dim strFilter As String, strTempFilter As String + strTempFilter = Nz(Me.txtFiltSchema.Value, vbNullString) + If Len(strTempFilter) > 0 Then + If InStr(1, strTempFilter, "*") > 0 Or InStr(1, strTempFilter, "%") > 0 Then + strFilter = " " & SourcePrefix & "TABLE_SCHEMA like " & SqlTools.TextToSqlText(Replace(strTempFilter, "%", "*")) + Else + strFilter = " " & SourcePrefix & "TABLE_SCHEMA = " & SqlTools.TextToSqlText(strTempFilter) + End If + End If + + strTempFilter = Nz(Me.txtFiltTabname.Value, vbNullString) + If Len(strTempFilter) > 0 Then + If Len(strFilter) > 0 Then + strFilter = strFilter & " AND " + End If + If InStr(1, strTempFilter, "*") > 0 Or InStr(1, strTempFilter, "%") > 0 Then + strFilter = strFilter & " " & SourcePrefix & "TABLE_NAME like " & SqlTools.TextToSqlText(Replace(strTempFilter, "%", "*")) + Else + strFilter = strFilter & " " & SourcePrefix & "TABLE_NAME = " & SqlTools.TextToSqlText(strTempFilter) + End If + End If + + GetDbmsTableListFilter = strFilter + +End Function + +Private Sub listLinkedTableNames() + + Dim strSQL As String + Dim strFilter As String + Dim lngObjectFilter As Long + + If Len(Me.txtFilterObjectName.Value) > 0 Then + strFilter = " AND O.Name like " & SqlTools.TextToSqlText(Me.txtFilterObjectName.Value) + End If + + lngObjectFilter = Nz(Me.cbxFilterObjectType.Value, 3) + + If (lngObjectFilter And 1) = 1 Then + + 'Tabellen + strSQL = "SELECT 'T' AS [*], O.Name AS TABLE_NAME, O.ForeignName" & _ + " FROM [" & CurrentDb.Name & "].MSysObjects O" & _ + " WHERE O.ForeignName > '' AND O.Type IN (4, 6)" + + If Len(strFilter) > 0 Then + strSQL = strSQL & strFilter + End If + End If + + If (lngObjectFilter And 2) = 2 Then + + If lngObjectFilter = 3 Then + strSQL = strSQL & " UNION ALL " + End If + + '+PT-Abfragen + strSQL = strSQL & _ + "SELECT 'Q' AS [*], O.Name AS TABLE_NAME, Q.Expression AS ForeignName" & _ + " FROM [" & CurrentDb.Name & "].MSysObjects O INNER JOIN [" & CurrentDb.Name & "].MSysQueries Q ON O.Id = Q.ObjectId" & _ + " WHERE O.Type = 5 And Q.Attribute = 1 And Q.Name1 Like 'ODBC;*'" + + If Len(strFilter) > 0 Then + strSQL = strSQL & strFilter + End If + + End If + + strSQL = strSQL & " ORDER BY 1 desc, 2 asc" + + Me.lstLinkedTabNames.RowSource = strSQL + +End Sub + +Private Sub LinkTextboxTable() + + Dim strSourceTabName As String + Dim strTdfName As String + + strSourceTabName = Nz(Me.txtTabName, vbNullString) + If Len(strSourceTabName) = 0 Then + MsgBox "Please enter a table name." + Exit Sub + End If + + strTdfName = strSourceTabName + DbCon.ODBC.LinkTable strSourceTabName, strTdfName, CurrentConnectionInfo.SavePassword + Application.RefreshDatabaseWindow + +End Sub + +Private Sub LinkSelectedTables() + + Dim varItm As Variant + Dim lb As ListBox + Dim strSourceTabName As String + Dim strSourceTabSchema As String + Dim strTdfName As String + + DbCon.CurrentDb.TableDefs.Refresh 'AnwendungsDB verwenden + + Set lb = Me.lstTabNames + For Each varItm In lb.ItemsSelected + strSourceTabName = Nz(lb.Column(2, varItm), vbNullString) + strSourceTabSchema = Nz(lb.Column(1, varItm), vbNullString) + If Len(strSourceTabSchema) > 0 Then strSourceTabSchema = strSourceTabSchema & "." + strTdfName = strSourceTabName + DbCon.ODBC.LinkTable strSourceTabSchema & strSourceTabName, strTdfName, CurrentConnectionInfo.SavePassword + lb.Selected(varItm) = False + Next + + lb.Requery + + DbCon.CurrentDb.TableDefs.Refresh + Application.RefreshDatabaseWindow + +End Sub + +Private Sub StartReconnectOdbc() + If Me.cbSelectAll.Value = True Then + reconnectAllTab + Else + ReconnectSelectedTab + End If +End Sub + +Private Sub reconnectAllTab() + Me.labObjectCounter.Caption = L10n.Text("Tables/queries were linked") + Me.labLastObjectName.Caption = L10n.Text("last linked:") + Me.txtObjectCounter.Value = Null + Set m_OdbcHandler = DbCon.ODBC + + TryConnectClientOdbcHandlerEventBridge m_OdbcHandler + + m_OdbcHandler.RelinkTablesAndQueries CurrentConnectionInfo.SavePassword, m_DoEventCounter ' 10 statt 1 würde nur jede 10. Aktualisierung anzeigen und den Ablauf beschleunigen + Set m_OdbcHandler = Nothing + ShowCompleteMessage +End Sub + +Private Sub TryConnectClientOdbcHandlerEventBridge(ByVal OdbcHandlerRef As OdbcHandler) + + Dim HookObserver As Object + +With New ErrorTrappingObserver + + .ErrorTrapping = BreakOnUnhandledErrors + +On Error Resume Next + + Set HookObserver = Application.Run("GetDbmsConnectionWizardHookObserver") + +On Error GoTo 0 + +End With + + If HookObserver Is Nothing Then + Exit Sub + End If + + Set m_OdbcHandlerEventBridge = New OdbcHandlerEventBridge + m_OdbcHandlerEventBridge.Init OdbcHandlerRef, HookObserver + + +End Sub + +Private Sub ReconnectSelectedTab() + + Dim varItm As Variant + Dim lb As ListBox + Dim strTdfQdfName As String + Dim lngCnt As Long + Dim strOdbcConnectionString As String + Dim bolSavePassword As Boolean + + DbCon.CurrentDb.TableDefs.Refresh 'AnwendungsDB verwenden + + Me.labObjectCounter.Caption = L10n.Text("Tables/queries were linked") + Me.labLastObjectName.Caption = L10n.Text("last linked:") + Me.txtObjectCounter.Value = Null + + bolSavePassword = CurrentConnectionInfo.SavePassword + strOdbcConnectionString = CurrentConnectionInfo.OdbcConnectionString(Not bolSavePassword) + + Set lb = Me.lstLinkedTabNames + For Each varItm In lb.ItemsSelected + strTdfQdfName = Nz(lb.Column(1, varItm), vbNullString) + 'On Error Resume Next + If Nz(lb.Column(0, varItm), vbNullString) = "Q" Then + DbCon.ODBC.RelinkPassThroughQuery strTdfQdfName, bolSavePassword + Else + DbCon.ODBC.RelinkTable strTdfQdfName, bolSavePassword + End If + 'On Error GoTo 0 + lngCnt = lngCnt + 1 + Me.txtObjectCounter.Value = lngCnt + Me.txtLastObjectName.Value = strTdfQdfName + lb.Selected(varItm) = False + DoEvents + Next + + lb.Requery + + DbCon.CurrentDb.TableDefs.Refresh + Application.RefreshDatabaseWindow + + ShowCompleteMessage + +End Sub + +Private Sub StartDeleteOdbcTableDefs() + Me.txtObjectCounter.Value = Null + Me.labObjectCounter.Caption = L10n.Text("linked tables were removed") + Me.labLastObjectName.Caption = L10n.Text("last removed:") + Set m_OdbcHandler = DbCon.ODBC + m_OdbcHandler.DeleteOdbcTableDefs m_DoEventCounter + Set m_OdbcHandler = Nothing + Application.RefreshDatabaseWindow + listLinkedTableNames +End Sub + +Private Sub DeleteSelectedTabs() + + Dim db As DAO.Database + Dim varItm As Variant + Dim lb As ListBox + Dim strTdfQdfName As String + Dim lngCnt As Long + + Set db = CurrentDb + db.TableDefs.Refresh 'AnwendungsDB verwenden + + Me.labObjectCounter.Caption = L10n.Text("linked tables were removed") + Me.labLastObjectName.Caption = L10n.Text("last removed:") + Me.txtObjectCounter.Value = Null + + Set lb = Me.lstLinkedTabNames + For Each varItm In lb.ItemsSelected + strTdfQdfName = Nz(lb.Column(1, varItm), vbNullString) + If Nz(lb.Column(1, varItm), vbNullString) = "Q" Then + db.QueryDefs.Delete strTdfQdfName + Else + db.TableDefs.Delete strTdfQdfName + End If + + lngCnt = lngCnt + 1 + Me.txtObjectCounter.Value = lngCnt + Me.txtLastObjectName.Value = strTdfQdfName + lb.Selected(varItm) = False + Next + + lb.Requery + + db.TableDefs.Refresh ' + Application.RefreshDatabaseWindow + + listLinkedTableNames + +End Sub + + +Private Sub tabLinkTables_Change() +On Error GoTo HandleErr + + Select Case Me.tabLinkTables.Value + Case 0 + listLinkedTableNames + Case 1 + If Me.ogLinkMode = 2 Then + listDbmsTableNames + End If + Case Else + ' + End Select + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Function CheckListDbmsTableMode() As Boolean + If Len(CurrentConnectionInfo.TableListSqlText) = 0 Then + CheckListDbmsTableMode = False + Else + CheckListDbmsTableMode = True + End If +End Function + +Private Sub txtFilterObjectName_KeyDown(KeyCode As Integer, Shift As Integer) +On Error GoTo HandleErr + + If KeyCode = vbKeyReturn Then + listLinkedTableNames + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub txtFiltSchema_AfterUpdate() +On Error GoTo HandleErr + + RefreshDbmsTableNamesList + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub txtFiltTabname_AfterUpdate() +On Error GoTo HandleErr + + RefreshDbmsTableNamesList + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub ShowCompleteMessage() + Me.txtLastObjectName.Value = Me.txtLastObjectName.Value & "." + Me.labCompletionInfo.Visible = True + Me.TimerInterval = 2000 +End Sub + +Private Sub m_L10nDict_LanguageChanged() + L10n.TranslateControls Me.Controls +End Sub diff --git a/source/forms/frmConfig_LinkTables.form b/source/forms/frmConfig_LinkTables.form new file mode 100644 index 0000000..6bdd173 --- /dev/null +++ b/source/forms/frmConfig_LinkTables.form @@ -0,0 +1,590 @@ +Version =20 +VersionRequired =20 +Begin Form + RecordSelectors = NotDefault + AutoCenter = NotDefault + NavigationButtons = NotDefault + DividingLines = NotDefault + DefaultView =0 + ScrollBars =0 + TabularFamily =168 + PictureAlignment =2 + DatasheetGridlinesBehavior =3 + GridY =10 + Width =9300 + DatasheetFontHeight =10 + ItemSuffix =47 + Left =1000 + Top =1000 + Right =50000 + Bottom =50000 + OnUnload ="[Event Procedure]" + RecSrcDt = Begin + 0x452ec210ff79e340 + End + Caption ="Config Linked Tables" + OnOpen ="[Event Procedure]" + DatasheetFontName ="Tahoma" + OnTimer ="[Event Procedure]" + OnLoad ="[Event Procedure]" + FilterOnLoad =0 + ShowPageMargins =0 + AllowLayoutView =0 + DatasheetGridlinesColor12 =12632256 + Begin + Begin Label + BackStyle =0 + FontName ="Tahoma" + End + Begin Line + BorderLineStyle =0 + Width =1701 + End + Begin CommandButton + Width =1701 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin OptionButton + SpecialEffect =2 + BorderLineStyle =0 + LabelX =230 + LabelY =-30 + End + Begin CheckBox + SpecialEffect =2 + BorderLineStyle =0 + LabelX =230 + LabelY =-30 + End + Begin OptionGroup + SpecialEffect =3 + BorderLineStyle =0 + Width =1701 + Height =1701 + End + Begin TextBox + FELineBreak = NotDefault + SpecialEffect =2 + OldBorderStyle =0 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + AsianLineBreak =255 + End + Begin ListBox + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + Height =1417 + LabelX =-1701 + FontName ="Tahoma" + End + Begin ComboBox + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontSize =11 + BorderColor =12632256 + FontName ="Calibri" + AllowValueListEdits =1 + InheritValueList =1 + End + Begin Subform + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + Height =1701 + End + Begin Tab + Width =5100 + Height =3420 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin Page + Width =1701 + Height =1701 + End + Begin Section + CanGrow = NotDefault + Height =6406 + BackColor =-2147483633 + Name ="Detailbereich" + Begin + Begin Tab + OverlapFlags =85 + BackStyle =0 + Left =60 + Top =90 + Width =9120 + Height =6240 + Name ="tabLinkTables" + OnChange ="[Event Procedure]" + HorizontalAnchor =2 + VerticalAnchor =2 + + Begin + Begin Page + OverlapFlags =87 + AccessKey =85 + Left =158 + Top =450 + Width =8940 + Height =5768 + Name ="tcpRefresh" + Tag ="LANG:" + Caption ="&Update existing linked tables" + UnicodeAccessKey =85 + Begin + Begin CheckBox + OverlapFlags =215 + Left =5839 + Top =737 + Width =275 + Name ="cbSelectAll" + AfterUpdate ="[Event Procedure]" + DefaultValue ="-1" + HorizontalAnchor =1 + + Begin + Begin Label + OverlapFlags =247 + Left =6075 + Top =705 + Width =2925 + Height =240 + Name ="labSelectAll" + Caption ="all linked tables/queries" + Tag ="LANG:" + HorizontalAnchor =1 + End + End + End + Begin ComboBox + LimitToList = NotDefault + Enabled = NotDefault + RowSourceTypeInt =1 + OverlapFlags =215 + IMESentenceMode =3 + ColumnCount =2 + ListRows =3 + Left =2271 + Top =572 + Width =1986 + FontSize =8 + TabIndex =1 + Name ="cbxFilterObjectType" + RowSourceType ="Value List" + RowSource ="3;\"(alle)\";1;\"Tabellen/Sichten\";2;\"Pass-Thorugh-Abfragen\"" + ColumnWidths ="0;2268" + DefaultValue ="3" + FontName ="Tahoma" + OnKeyDown ="[Event Procedure]" + + Begin + Begin Label + OverlapFlags =215 + Left =1590 + Top =572 + Width =675 + Height =240 + Name ="Bezeichnungsfeld33" + Caption ="Type:" + Tag ="LANG:" + End + End + End + Begin TextBox + Enabled = NotDefault + OverlapFlags =215 + IMESentenceMode =3 + Left =2271 + Top =855 + Width =1986 + TabIndex =2 + Name ="txtFilterObjectName" + OnKeyDown ="[Event Procedure]" + HorizontalAnchor =2 + + Begin + Begin Label + OverlapFlags =223 + Left =1590 + Top =855 + Width =675 + Height =240 + Name ="Bezeichnungsfeld31" + Caption ="Name:" + End + End + End + Begin CommandButton + Enabled = NotDefault + OverlapFlags =215 + AccessKey =70 + Left =4365 + Top =585 + Width =1200 + Height =525 + TabIndex =3 + Name ="cmdUseFilter" + Caption ="Apply &Filter" + OnClick ="[Event Procedure]" + Tag ="LANG:" + UnicodeAccessKey =70 + HorizontalAnchor =1 + + End + Begin CommandButton + OverlapFlags =215 + Left =5725 + Top =1190 + Width =3285 + Height =405 + TabIndex =4 + Name ="cmdReconnect" + Caption ="Update linked tables" + OnClick ="[Event Procedure]" + Tag ="LANG:" + HorizontalAnchor =1 + + End + Begin ListBox + ColumnHeads = NotDefault + Enabled = NotDefault + OverlapFlags =247 + MultiSelect =2 + IMESentenceMode =3 + ColumnCount =3 + Left =225 + Top =1200 + Width =5325 + Height =4987 + TabIndex =5 + BoundColumn =1 + Name ="lstLinkedTabNames" + RowSourceType ="Table/Query" + ColumnWidths ="226;2608;2268" + HorizontalAnchor =2 + VerticalAnchor =2 + + End + Begin Label + OverlapFlags =215 + Left =210 + Top =540 + Width =1305 + Height =285 + FontSize =10 + FontWeight =700 + ForeColor =14602694 + Name ="labFilter" + Caption ="Filter list" + Tag ="LANG:" + End + Begin CommandButton + OverlapFlags =215 + AccessKey =82 + Left =5725 + Top =1814 + Width =3285 + Height =405 + TabIndex =6 + Name ="cmdDeleteLinkedTables" + Caption ="&Remove linked tables" + OnClick ="[Event Procedure]" + Tag ="LANG:" + UnicodeAccessKey =82 + HorizontalAnchor =1 + + End + Begin TextBox + SpecialEffect =0 + OldBorderStyle =1 + OverlapFlags =215 + TextAlign =2 + BackStyle =0 + IMESentenceMode =3 + Left =5727 + Top =2437 + Width =516 + TabIndex =7 + BackColor =-2147483633 + BorderColor =8421504 + Name ="txtObjectCounter" + HorizontalAnchor =1 + + Begin + Begin Label + OverlapFlags =215 + TextAlign =1 + Left =6299 + Top =2437 + Width =2700 + Height =240 + Name ="labObjectCounter" + Caption ="Tables/queries were linked" + Tag ="LANG:" + HorizontalAnchor =1 + End + End + End + Begin TextBox + SpecialEffect =0 + OverlapFlags =215 + TextAlign =1 + BackStyle =0 + IMESentenceMode =3 + Left =5725 + Top =3004 + Width =3276 + Height =435 + TabIndex =8 + BackColor =-2147483633 + BorderColor =8421504 + Name ="txtLastObjectName" + HorizontalAnchor =1 + + Begin + Begin Label + OverlapFlags =223 + TextAlign =1 + Left =5725 + Top =2777 + Width =1365 + Height =240 + Name ="labLastObjectName" + Caption ="last linked:" + Tag ="LANG:" + HorizontalAnchor =1 + End + End + End + Begin Label + Visible = NotDefault + BackStyle =1 + OverlapFlags =215 + TextAlign =2 + Left =5784 + Top =3685 + Width =3210 + Height =907 + FontSize =12 + TopMargin =170 + BackColor =10092543 + ForeColor =10027008 + Name ="labCompletionInfo" + Caption ="Linking completed" + FontName ="Verdana" + Tag ="LANG:" + HorizontalAnchor =1 + End + End + End + Begin Page + OverlapFlags =247 + AccessKey =78 + Left =158 + Top =450 + Width =8940 + Height =5768 + Name ="tcpNew" + Tag ="LANG:" + Caption ="Create &new linked tables" + UnicodeAccessKey =110 + Begin + Begin OptionGroup + OverlapFlags =247 + Left =275 + Top =580 + Width =3479 + Height =906 + Name ="ogLinkMode" + AfterUpdate ="[Event Procedure]" + DefaultValue ="0" + + Begin + Begin OptionButton + OverlapFlags =247 + AccessKey =77 + Left =445 + Top =750 + OptionValue =1 + Name ="ogLinkModeOpt1" + UnicodeAccessKey =109 + + Begin + Begin Label + OverlapFlags =247 + Left =675 + Top =720 + Width =2850 + Height =240 + Name ="Bezeichnungsfeld8" + Caption ="Select table/view &manually" + Tag ="LANG:" + End + End + End + Begin OptionButton + OverlapFlags =247 + AccessKey =68 + Left =453 + Top =1110 + TabIndex =1 + OptionValue =2 + Name ="ogLinkModeOpt2" + UnicodeAccessKey =100 + + Begin + Begin Label + OverlapFlags =247 + Left =690 + Top =1080 + Width =2835 + Height =240 + Name ="Bezeichnungsfeld4" + Caption ="Show tables from &database" + Tag ="LANG:" + End + End + End + End + End + Begin CommandButton + OverlapFlags =247 + AccessKey =76 + Left =7086 + Top =1587 + Width =1920 + Height =405 + TabIndex =1 + Name ="cmdLinkTables" + Caption ="&Link table(s)" + OnClick ="[Event Procedure]" + Tag ="LANG:" + UnicodeAccessKey =76 + HorizontalAnchor =1 + + End + Begin TextBox + Enabled = NotDefault + OverlapFlags =247 + IMESentenceMode =3 + Left =3855 + Top =1190 + Width =3081 + Height =255 + TabIndex =2 + Name ="txtTabName" + HorizontalAnchor =2 + + Begin + Begin Label + OverlapFlags =247 + Left =3855 + Top =907 + Width =1125 + Height =240 + Name ="Bezeichnungsfeld25" + Caption ="Name:" + End + End + End + Begin ListBox + ColumnHeads = NotDefault + Enabled = NotDefault + OverlapFlags =247 + MultiSelect =2 + IMESentenceMode =3 + ColumnCount =3 + Left =283 + Top =1590 + Width =6645 + Height =4597 + TabIndex =3 + Name ="lstTabNames" + RowSourceType ="Table/Query" + RowSource ="SELECT NULL AS TABLE_NAME, NULL AS TABLE_SCHEMA FROM tab1DS WHERE 1=0; " + ColumnWidths ="0;1419;3629" + HorizontalAnchor =2 + VerticalAnchor =2 + + End + Begin TextBox + OverlapFlags =247 + IMESentenceMode =3 + Left =7095 + Top =2938 + Width =1926 + Height =255 + TabIndex =4 + Name ="txtFiltSchema" + AfterUpdate ="[Event Procedure]" + HorizontalAnchor =1 + + Begin + Begin Label + OverlapFlags =247 + Left =7095 + Top =2655 + Width =1920 + Height =240 + Name ="labFiltSchema" + Caption ="Schema:" + HorizontalAnchor =1 + End + End + End + Begin TextBox + OverlapFlags =247 + IMESentenceMode =3 + Left =7086 + Top =3571 + Width =1926 + Height =255 + TabIndex =5 + Name ="txtFiltTabname" + AfterUpdate ="[Event Procedure]" + HorizontalAnchor =1 + + Begin + Begin Label + OverlapFlags =247 + Left =7086 + Top =3288 + Width =1920 + Height =240 + Name ="labFiltTabname" + Caption ="Name:" + HorizontalAnchor =1 + End + End + End + Begin Label + OverlapFlags =247 + Left =7080 + Top =2325 + Width =675 + Height =285 + FontSize =10 + FontWeight =700 + Name ="labDbmsTabFilter" + Caption ="Filter:" + End + End + End + End + End + End + End + End +End +CodeBehindForm +' See "frmConfig_LinkTables.cls" diff --git a/source/forms/frmConfig_LinkTables.json b/source/forms/frmConfig_LinkTables.json new file mode 100644 index 0000000..e7b0167 --- /dev/null +++ b/source/forms/frmConfig_LinkTables.json @@ -0,0 +1,78 @@ +{ + "Info": { + "Class": "clsDbForm", + "Description": "frmConfig_LinkTables Print Settings" + }, + "Items": { + "Printer": { + "Orientation": "Portrait", + "PaperSize": "A4" + }, + "Margins": { + "LeftMargin": 1.0097, + "TopMargin": 1.0097, + "RightMargin": 1.0097, + "BotMargin": 1.0097, + "DataOnly": false, + "Width": 5, + "Height": 3, + "DefaultSize": true, + "Columns": 1, + "ColumnSpacing": 0.25, + "RowSpacing": 0, + "ItemLayout": "Horizontal Columns", + "FastPrint": 1, + "Datasheet": 1 + }, + "ConditionalFormatting": { + "txtTabName": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtFiltSchema": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + }, + "txtFiltTabname": { + "Rules": [ + { + "Type": "FieldValue", + "Enabled": true, + "FontBold": false, + "FontItalic": false, + "FontUnderline": false, + "ForeColor": "RGB(0,0,0)", + "BackColor": "RGB(255,255,255)", + "Operator": "GreaterThan", + "Expression1": "\"\"", + "Expression2": "" + } + ] + } + } + } +} diff --git a/source/forms/frmTest_SQL.cls b/source/forms/frmTest_SQL.cls new file mode 100644 index 0000000..0704b93 --- /dev/null +++ b/source/forms/frmTest_SQL.cls @@ -0,0 +1,452 @@ +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Compare Database +Option Explicit + +Private Const m_Caption As String = "SQL testen" + +Private WithEvents m_DbConnectionInfo As DbConnectionInfo +Attribute m_DbConnectionInfo.VB_VarHelpID = -1 +Private m_CalledByWizard As Boolean + +Private Property Get CurrentDbConnectionInfo() As DbConnectionInfo + + If m_DbConnectionInfo Is Nothing Then + Set m_DbConnectionInfo = CurrentConnectionInfo + If Len(m_DbConnectionInfo.CID) = 0 Then + m_DbConnectionInfo.CheckConnection + End If + End If + Set CurrentDbConnectionInfo = m_DbConnectionInfo + +End Property + +Private Function getCID() As String + getCID = CurrentDbConnectionInfo.CID +End Function + + +Private Sub setCmdStatus(ByVal bCmdStart As Boolean) + + Dim bolEnableCmdBtn As Boolean + + Me!sysFirst.SetFocus + + DoCmd.Hourglass bCmdStart + bolEnableCmdBtn = Not bCmdStart + + Me!cmdExecuteSQL.Enabled = bolEnableCmdBtn + +End Sub + +Private Function checkSelection() As Boolean + + If Len(CurrentDbConnectionInfo.DbmsName) = 0 Then + checkSelection = False + MsgBox "Please select the DBMS first!" + Exit Function + End If + + If IsNull(Me.txtSQL.Value) Then + checkSelection = False + MsgBox "Please specify SQL statement." + Exit Function + End If + + checkSelection = True + +End Function + +Private Sub ExecuteSQL() + + Select Case Me.optRS + Case 1 'ADO + ExecuteSQL_ADO + Case 2 'DAO/DB + ExecuteSQL_DAO + Case 3 'DAO/PT + ExecuteSQL_DAOPT + Case Else + ' + End Select + +End Sub + + +Private Sub ExecuteSQL_ADO() + + Dim frmDS As Form_frmTest_SQL_Datasheet + + Dim cnn As ADODB.Connection + Dim rst As ADODB.Recordset + Dim strErr As String + Dim errCnn As ADODB.Error + Dim strSQL As String + + Dim T As QpcStopwatch + + Set T = New QpcStopwatch + + If checkSelection = False Then + Exit Sub + End If + + strSQL = Me.txtSQL + Me.labMsg.Caption = L10n.Text("Statement is executed") + Me.labTime.Caption = vbNullString + Me.Repaint + + Set cnn = DbCon.CurrentConnection + +On Error Resume Next + T.StartT + Set rst = DbCon.ADODB.OpenRecordset(strSQL, adOpenKeyset, adLockOptimistic, adUseClient) + T.StopT + If Err.Number <> 0 Then + strErr = Err.Description + End If + + If cnn.Errors.Count > 0 Then + For Each errCnn In cnn.Errors + strErr = strErr & errCnn.Description & vbNewLine + Next + cnn.Errors.Clear + End If + +On Error GoTo 0 + If Len(strErr) > 0 Then + If (rst.State = adStateOpen And adStateOpen) = adStateOpen Then rst.Close + Me.labMsg.Caption = strErr + MsgBox strErr + Else + If (rst.State = adStateOpen And adStateOpen) = adStateOpen Then 'rst ist offen => in Form anzeigen + DoCmd.OpenForm "frmTest_SQL_Datasheet", acFormDS + Set frmDS = Forms("frmTest_SQL_Datasheet") + frmDS.SetFormData rst + End If + Me.labMsg.Caption = L10n.Text("SQL statement was executed.") + Me.labTime.Caption = Format$(T.TimeMSec, "0.00 \m\s") + setCmdStatus False + End If + + Set T = Nothing + Set rst = Nothing + Set cnn = Nothing + +End Sub + +Private Sub ExecuteSQL_DAO() + + Dim frmDS As Form_frmTest_SQL_Datasheet + + Dim rst As DAO.Recordset + Dim strErr As String + Dim bolOpenRS As Boolean + + Dim T As QpcStopwatch + + Set T = New QpcStopwatch + + If checkSelection = False Then + Exit Sub + End If + + 'setCmdStatus True + Me.labMsg.Caption = L10n.Text("Statement is executed") + Me.labTime.Caption = vbNullString + Me.Repaint + +On Error Resume Next + 'einfach einmal versuchen, ob SQL-String per openrecordset geöffnet werden kann + bolOpenRS = True + T.StartT + Set rst = DbCon.ODBC.OpenRecordset(Me.txtSQL.Value, dbOpenDynaset, dbSeeChanges) + T.StopT + If Err.Number = 3219 Or Err.Number = 3324 Then 'keine DS zurückgegeben = Aktionsabfrage? + bolOpenRS = False + Err.Clear + T.StartT + DbCon.ODBC.Execute Me.txtSQL.Value + T.StopT + End If + + If Err.Number <> 0 Then + strErr = "Fehler " & Err.Number & ": " & Err.Description + Err.Clear + End If + + If Len(strErr) > 0 Then + Me.labMsg.Caption = strErr + MsgBox strErr + Else +On Error GoTo 0 + If bolOpenRS Then 'rst öffnen => in Form anzeigen + DoCmd.OpenForm "frmTest_SQL_Datasheet", acFormDS + Set frmDS = Forms("frmTest_SQL_Datasheet") + frmDS.SetFormData rst + End If + Me.labMsg.Caption = L10n.Text("SQL statement was executed.") + Me.labTime.Caption = Format$(T.TimeMSec, "0.00 \m\s") + setCmdStatus False + End If + +End Sub + +Private Sub ExecuteSQL_DAOPT() + + Dim frmDS As Form_frmTest_SQL_Datasheet + + Dim rst As DAO.Recordset + Dim strErr As String + Dim bolOpenRS As Boolean + + Dim T As QpcStopwatch + + Set T = New QpcStopwatch + + If checkSelection = False Then + Exit Sub + End If + + 'setCmdStatus True + Me.labMsg.Caption = L10n.Text("Statement is executed") + Me.labTime.Caption = vbNullString + Me.Repaint + +On Error Resume Next + bolOpenRS = True + + T.StartT + Set rst = DbCon.ODBC.OpenRecordsetPT(Me.txtSQL.Value, dbOpenDynaset) + T.StopT + If Err.Number = 3325 Then 'keine DS zurückgegeben = Aktionsabfrage? + bolOpenRS = False + Err.Clear + ' .. Abfrage müsste trotzem ausgeführt worden sein => keine weiteres Execute erforderlich + 'T.StartT + 'DbConnection.ODBC.ExecutePT Me.txtSQL.Value, dbSQLPassThrough + 'T.StopT + End If + + If Err.Number <> 0 Then 'es ist ein Fehler aufgetreten + strErr = "Fehler " & Err.Number & ": " & Err.Description + Err.Clear + End If + + If Len(strErr) > 0 Then + Me.labMsg.Caption = strErr + MsgBox strErr + Else +On Error GoTo 0 + If bolOpenRS Then 'rst öffnen => in Form anzeigen + DoCmd.OpenForm "frmTest_SQL_Datasheet", acFormDS + Set frmDS = Forms("frmTest_SQL_Datasheet") + frmDS.SetFormData rst + End If + Me.labMsg.Caption = L10n.Text("SQL statement was executed.") + Me.labTime.Caption = Format$(T.TimeMSec, "0.00 \m\s") + setCmdStatus False + End If + +End Sub + +Private Sub cmdExecuteSQL_Click() +On Error Resume Next + ExecuteSQL +End Sub + +Private Sub cmdSavePT_Click() +On Error Resume Next + savePassThroughQueryDef +End Sub + +Private Sub savePassThroughQueryDef() + + Dim QueryDefName As String + Dim queryExists As Boolean + Dim qdf As DAO.QueryDef + Dim db As DAO.Database + Dim Cancel As Boolean + + QueryDefName = vbNullString + Do Until (getPtQueryDefName(QueryDefName, queryExists, Cancel) = True) + If Cancel Then + Exit Sub + End If + Loop + + Set db = CurrentDb + + If queryExists Then + Set qdf = db.QueryDefs(QueryDefName) + Else + Set qdf = db.CreateQueryDef(QueryDefName) + End If + + qdf.SQL = Me.txtSQL.Value + qdf.Connect = DbCon.ODBC.ConnectionString + qdf.Close + + Set qdf = Nothing + Set db = Nothing + + RefreshDatabaseWindow + +End Sub + +Private Function getPtQueryDefName(ByRef QueryDefName As String, ByRef bQueryDefExists As Boolean, ByRef Cancelled As Boolean) As Boolean + + QueryDefName = InputBox("Under which name should the query be saved?", "Enter query name", QueryDefName) + + If Len(QueryDefName) = 0 Then + Cancelled = True + getPtQueryDefName = False + Exit Function + End If + + If TableDefExists(QueryDefName) Then + If VBA.MsgBox(FormatText(L10n.Text("There is already a table named '{0}'"), QueryDefName) & vbNewLine & _ + L10n.Text("Please choose another name."), vbExclamation + vbDefaultButton2 + vbOKCancel) = vbOK Then + getPtQueryDefName = False + Exit Function + Else + Cancelled = True + getPtQueryDefName = False + Exit Function + End If + End If + + bQueryDefExists = QueryDefExists(QueryDefName) + If bQueryDefExists Then + Select Case VBA.MsgBox(FormatText(L10n.Text("Es existiert bereits eine Abfrage mit dem Namen '{0}'"), QueryDefName) & vbNewLine & _ + L10n.Text("Should this be changed?"), vbExclamation + vbDefaultButton2 + vbYesNoCancel) + + Case vbYes + ' + Case vbCancel + Cancelled = True + getPtQueryDefName = False + Exit Function + Case Else + getPtQueryDefName = False + Exit Function + + End Select + + End If + + getPtQueryDefName = True + +End Function + +Private Sub Form_Close() +On Error Resume Next + DoCmd.Hourglass False 'falls es einmal ein Problem gab +End Sub + +Private Sub Form_Load() +On Error Resume Next + + setDbmsInfo + + Me.Section(acDetail).BackColor = dcwBackgroundForm + Me.labDbmsName.BackColor = dcwInfoLabelBackColor + Me.labTimeL.BackColor = dcwInfoLabelBackColor + Me.labTime.BackColor = dcwInfoLabelBackColor + Me.labMsg.BackColor = dcwInfoLabelBackColor + + Me.Caption = m_Caption + + If Len(Me.OpenArgs) > 0 Then + m_CalledByWizard = True + End If + +End Sub + +Private Sub Form_Open(Cancel As Integer) +On Error GoTo HandleErr + + If Len(Me.OpenArgs) > 0 Then + Dim lngRecordsetMode As Long + lngRecordsetMode = Val(Me.OpenArgs) + If lngRecordsetMode > 0 And lngRecordsetMode < 4 Then + Me.optRS.Value = lngRecordsetMode + End If + End If + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub Form_Resize() + + Dim lngH As Long + +On Error Resume Next + + lngH = Me.InsideHeight + Me.Section(0).Height = lngH + Me.txtSQL.Height = lngH - Me.txtSQL.Top - Me.labMsg.Height - 200 + Me.labMsg.Top = lngH - Me.labMsg.Height - 100 + Me.labTime.Top = lngH - Me.labTime.Height - 100 + Me.labTimeL.Top = Me.labTime.Top - Me.labTimeL.Height + + Me.txtSQL.Width = Me.InsideWidth - Me.txtSQL.Left - 100 + Me.labMsg.Width = Me.InsideWidth - Me.labMsg.Left - 100 + +End Sub + + +Private Sub Form_Unload(Cancel As Integer) +On Error Resume Next + Set m_DbConnectionInfo = Nothing + If Not m_CalledByWizard Then + DisposeWizard + End If +End Sub + +Private Sub m_DbConnectionInfo_DbmsConnectionChanged(ByVal newCID As String) +On Error GoTo HandleErr + + setDbmsInfo + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub m_DbConnectionInfo_DbmsInfoMessage(ByVal Source As String, ByVal Msg As String, ByVal MsgStyle As VbMsgBoxStyle) +On Error GoTo HandleErr + +On Error Resume Next + Me.labMsg.Caption = Msg + +ExitHere: + Exit Sub + +HandleErr: + HandleError Err.Number, Err.Source, Err.Description, aclibErrMsgBox +End Sub + +Private Sub setDbmsInfo() + + Dim strCID As String + Dim bolEnabled As Boolean + + strCID = getCID + bolEnabled = (Len(strCID) > 0) + If Not bolEnabled Then + strCID = L10n.Text("Select connection") + End If + Me.labDbmsName.Caption = strCID + Me.cmdExecuteSQL.Enabled = bolEnabled + Me.optDAPPT.Enabled = (CurrentConnectionInfo.DbmsName <> "MSJET") + +End Sub diff --git a/source/forms/frmTest_SQL.form b/source/forms/frmTest_SQL.form new file mode 100644 index 0000000..45feae2 --- /dev/null +++ b/source/forms/frmTest_SQL.form @@ -0,0 +1,333 @@ +Version =20 +VersionRequired =20 +Begin Form + RecordSelectors = NotDefault + ShortcutMenu = NotDefault + AutoCenter = NotDefault + NavigationButtons = NotDefault + DividingLines = NotDefault + DefaultView =0 + ScrollBars =0 + TabularFamily =119 + PictureAlignment =2 + DatasheetGridlinesBehavior =3 + GridY =10 + Width =10318 + DatasheetFontHeight =10 + ItemSuffix =50 + Left =1000 + Top =1000 + Right =50000 + Bottom =50000 + OnUnload ="[Event Procedure]" + RecSrcDt = Begin + 0xdc0c5e0e39c2e240 + End + Caption ="SQL testen" + OnOpen ="[Event Procedure]" + OnClose ="[Event Procedure]" + DatasheetFontName ="Arial" + OnResize ="[Event Procedure]" + OnLoad ="[Event Procedure]" + FilterOnLoad =0 + ShowPageMargins =0 + AllowLayoutView =0 + DatasheetGridlinesColor12 =12632256 + Begin + Begin Label + BackStyle =0 + FontName ="Tahoma" + End + Begin CommandButton + Width =1701 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin OptionButton + SpecialEffect =2 + BorderLineStyle =0 + LabelX =230 + LabelY =-30 + End + Begin OptionGroup + SpecialEffect =3 + BorderLineStyle =0 + Width =1701 + Height =1701 + End + Begin TextBox + FELineBreak = NotDefault + SpecialEffect =2 + OldBorderStyle =0 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + AsianLineBreak =255 + End + Begin ListBox + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + Height =1417 + LabelX =-1701 + FontName ="Tahoma" + End + Begin ComboBox + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + End + Begin Subform + SpecialEffect =2 + BorderLineStyle =0 + Width =1701 + Height =1701 + End + Begin ToggleButton + Width =283 + Height =283 + FontSize =8 + FontWeight =400 + ForeColor =-2147483630 + FontName ="Tahoma" + BorderLineStyle =0 + End + Begin Section + CanGrow = NotDefault + Height =9540 + BackColor =-2147483633 + Name ="Detailbereich" + Begin + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + BackStyle =0 + IMESentenceMode =3 + Width =0 + Height =0 + Name ="sysFirst" + + End + Begin TextBox + EnterKeyBehavior = NotDefault + AllowAutoCorrect = NotDefault + ScrollBars =2 + OldBorderStyle =1 + OverlapFlags =85 + TextAlign =1 + IMESentenceMode =3 + Left =1920 + Top =477 + Width =8276 + Height =8241 + FontSize =9 + TabIndex =1 + LineSpacing =57 + Name ="txtSQL" + + Begin + Begin Label + OverlapFlags =85 + Left =1927 + Top =113 + Width =1650 + Height =255 + FontSize =9 + FontWeight =700 + Name ="Bezeichnungsfeld22" + Caption ="SQL-Anweisung:" + End + End + End + Begin CommandButton + OverlapFlags =85 + Left =120 + Top =2490 + Width =1635 + Height =585 + FontWeight =700 + TabIndex =3 + Name ="cmdExecuteSQL" + Caption ="SQL-Anweisung ausführen" + OnClick ="[Event Procedure]" + + End + Begin Label + BackStyle =1 + OverlapFlags =85 + TextAlign =2 + Left =1884 + Top =8790 + Width =8306 + Height =645 + FontSize =9 + FontWeight =700 + BackColor =15132390 + ForeColor =10040115 + Name ="labMsg" + End + Begin OptionGroup + SpecialEffect =0 + OldBorderStyle =0 + OverlapFlags =85 + Left =300 + Top =1080 + Width =1251 + Height =1062 + TabIndex =2 + Name ="optRS" + DefaultValue ="1" + + Begin + Begin OptionButton + OverlapFlags =87 + Left =420 + Top =1187 + OptionValue =1 + Name ="Option34" + ControlTipText ="ADODB/OLEDB-Zugriff" + + Begin + Begin Label + OverlapFlags =247 + Left =641 + Top =1125 + Width =855 + Height =285 + FontSize =10 + FontWeight =700 + Name ="Bezeichnungsfeld35" + Caption ="ADODB" + End + End + End + Begin OptionButton + OverlapFlags =87 + Left =420 + Top =1528 + OptionValue =2 + Name ="Option36" + ControlTipText ="DAO/ODBC-Zugriff über DAO.Database" + + Begin + Begin Label + OverlapFlags =247 + Left =641 + Top =1470 + Width =855 + Height =285 + FontSize =10 + FontWeight =700 + Name ="Bezeichnungsfeld37" + Caption ="DAO BE" + End + End + End + Begin OptionButton + OverlapFlags =87 + Left =420 + Top =1872 + OptionValue =3 + Name ="optDAPPT" + ControlTipText ="DAO/ODBC-Zugriff mittels PT-Abfrage" + + Begin + Begin Label + OverlapFlags =247 + Left =650 + Top =1815 + Width =840 + Height =285 + FontSize =10 + FontWeight =700 + Name ="Bezeichnungsfeld48" + Caption ="DAO PT" + End + End + End + End + End + Begin Label + OverlapFlags =85 + Left =57 + Top =750 + Width =1800 + Height =285 + FontSize =10 + FontWeight =700 + Name ="Bezeichnungsfeld38" + Caption ="Zugriffsvarianten" + End + Begin Label + BackStyle =1 + OverlapFlags =93 + TextAlign =2 + Left =113 + Top =9117 + Width =1641 + Height =300 + FontSize =9 + FontWeight =700 + BackColor =15132390 + ForeColor =10040115 + Name ="labTime" + Caption ="- - -" + End + Begin Label + BackStyle =1 + OverlapFlags =215 + TextAlign =2 + Left =113 + Top =8787 + Width =1641 + Height =345 + FontSize =9 + TopMargin =29 + BackColor =15132390 + ForeColor =10040115 + Name ="labTimeL" + Caption ="Ausführungszeit" + End + Begin Label + BackStyle =1 + OldBorderStyle =1 + OverlapFlags =85 + TextAlign =2 + Left =56 + Top =56 + Width =1755 + Height =675 + FontSize =12 + FontWeight =700 + TopMargin =29 + BackColor =15132390 + Name ="labDbmsName" + Caption ="DBMS-Verbindung" + End + Begin CommandButton + OverlapFlags =85 + Left =113 + Top =3401 + Width =1635 + Height =615 + FontSize =7 + TabIndex =4 + Name ="cmdSavePT" + Caption ="SQL-Anweisung als\015\012Pass-Through Abfrage speichern" + OnClick ="[Event Procedure]" + + End + End + End + End +End +CodeBehindForm +' See "frmTest_SQL.cls" diff --git a/source/forms/frmTest_SQL.json b/source/forms/frmTest_SQL.json new file mode 100644 index 0000000..0591205 --- /dev/null +++ b/source/forms/frmTest_SQL.json @@ -0,0 +1,28 @@ +{ + "Info": { + "Class": "clsDbForm", + "Description": "frmTest_SQL Print Settings" + }, + "Items": { + "Printer": { + "Orientation": "Portrait", + "PaperSize": "A4" + }, + "Margins": { + "LeftMargin": 1.0097, + "TopMargin": 1.0097, + "RightMargin": 1.0097, + "BotMargin": 1.0097, + "DataOnly": false, + "Width": 5, + "Height": 3, + "DefaultSize": true, + "Columns": 1, + "ColumnSpacing": 0.25, + "RowSpacing": 0, + "ItemLayout": "Horizontal Columns", + "FastPrint": 1, + "Datasheet": 1 + } + } +} diff --git a/source/forms/frmTest_SQL_Datasheet.cls b/source/forms/frmTest_SQL_Datasheet.cls new file mode 100644 index 0000000..d507e4f --- /dev/null +++ b/source/forms/frmTest_SQL_Datasheet.cls @@ -0,0 +1,48 @@ +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Compare Database +Option Explicit + +Private Const m_conMaxCtlCnt As Long = 30 + +Public Sub SetFormData(ByRef rst As Object) 'rst kann ADODB oder DAO-Recordset sein! + + Dim lngRstFldCnt As Long + Dim lngMaxCnt As Long + Dim i As Long + + lngRstFldCnt = rst.Fields.Count + + If m_conMaxCtlCnt > lngRstFldCnt Then + lngMaxCnt = lngRstFldCnt - 1 'da von 0 gezählt wird + Else + lngMaxCnt = m_conMaxCtlCnt - 1 'es werden nicht alle Felder des Recordset übernommen + End If + + Me!Text0.Enabled = True 'nur zur Sicherheit + Me!Text0.SetFocus + + With rst + For i = 0 To lngMaxCnt + Me.Controls("lab" & i).Caption = .Fields(i).Name + Me.Controls("Text" & i).ControlSource = .Fields(i).Name + Me.Controls("Text" & i).Enabled = True + Next i + End With + + For i = lngMaxCnt + 1 To m_conMaxCtlCnt - 1 + Me.Controls("lab" & i).Caption = vbNullString + Me.Controls("Text" & i).ControlSource = vbNullString + Me.Controls("Text" & i).Enabled = False + Next i + + Set Me.Recordset = rst + +End Sub + +Private Sub Form_Unload(Cancel As Integer) +On Error Resume Next + Set Me.Recordset = Nothing +End Sub diff --git a/source/forms/frmTest_SQL_Datasheet.form b/source/forms/frmTest_SQL_Datasheet.form new file mode 100644 index 0000000..e173925 --- /dev/null +++ b/source/forms/frmTest_SQL_Datasheet.form @@ -0,0 +1,776 @@ +Version =20 +VersionRequired =20 +Begin Form + AutoResize = NotDefault + ShortcutMenu = NotDefault + AutoCenter = NotDefault + DefaultView =2 + TabularFamily =124 + PictureAlignment =2 + DatasheetGridlinesBehavior =3 + GridY =10 + Width =5442 + RowHeight =390 + DatasheetFontHeight =10 + ItemSuffix =76 + Left =1000 + Top =1000 + Right =50000 + Bottom =50000 + FrozenColumns =2 + OnUnload ="[Event Procedure]" + RecSrcDt = Begin + 0xf02028da35e0e240 + End + Caption ="Test: SQL-Ergebnis" + DatasheetFontName ="Arial" + FilterOnLoad =0 + AllowLayoutView =0 + DatasheetGridlinesColor12 =12632256 + Begin + Begin Label + BackStyle =0 + FontName ="Tahoma" + End + Begin TextBox + FELineBreak = NotDefault + SpecialEffect =2 + OldBorderStyle =0 + BorderLineStyle =0 + Width =1701 + LabelX =-1701 + FontName ="Tahoma" + AsianLineBreak =255 + End + Begin Section + Height =3458 + BackColor =-2147483633 + Name ="Detailbereich" + Begin + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1016 + Top =56 + Width =741 + ColumnWidth =3345 + Name ="Text0" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Top =56 + Width =960 + Height =240 + Name ="lab0" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1016 + Top =396 + Width =741 + ColumnWidth =2790 + TabIndex =3 + Name ="Text3" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Top =396 + Width =960 + Height =240 + Name ="lab3" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1016 + Top =737 + Width =741 + ColumnWidth =1140 + TabIndex =6 + Name ="Text6" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Top =737 + Width =960 + Height =240 + Name ="lab6" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1016 + Top =1077 + Width =741 + TabIndex =9 + Name ="Text9" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Top =1077 + Width =960 + Height =240 + Name ="lab9" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1016 + Top =1417 + Width =741 + TabIndex =12 + Name ="Text12" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Top =1417 + Width =960 + Height =240 + Name ="lab12" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1020 + Top =1755 + Width =741 + TabIndex =15 + Name ="Text15" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =4 + Top =1755 + Width =960 + Height =240 + Name ="lab15" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1020 + Top =2095 + Width =741 + TabIndex =18 + Name ="Text18" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =4 + Top =2095 + Width =960 + Height =240 + Name ="lab18" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1020 + Top =2435 + Width =741 + TabIndex =21 + Name ="Text21" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =4 + Top =2435 + Width =960 + Height =240 + Name ="lab21" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1020 + Top =2775 + Width =741 + TabIndex =24 + Name ="Text24" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =4 + Top =2775 + Width =960 + Height =240 + Name ="lab24" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =1020 + Top =3135 + Width =741 + TabIndex =27 + Name ="Text27" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =4 + Top =3135 + Width =960 + Height =240 + Name ="lab27" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2830 + Top =56 + Width =741 + ColumnWidth =3810 + TabIndex =1 + Name ="Text1" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1862 + Top =56 + Width =900 + Height =240 + Name ="lab1" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2830 + Top =396 + Width =741 + ColumnWidth =1800 + TabIndex =4 + Name ="Text4" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1862 + Top =396 + Width =900 + Height =240 + Name ="lab4" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2830 + Top =737 + Width =741 + ColumnWidth =1020 + TabIndex =7 + Name ="Text7" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1864 + Top =737 + Width =915 + Height =240 + Name ="lab7" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2830 + Top =1077 + Width =741 + TabIndex =10 + Name ="Text10" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1864 + Top =1077 + Width =915 + Height =240 + Name ="lab10" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2830 + Top =1417 + Width =741 + TabIndex =13 + Name ="Text13" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1864 + Top =1417 + Width =915 + Height =240 + Name ="lab13" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2834 + Top =1755 + Width =741 + TabIndex =16 + Name ="Text16" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1868 + Top =1755 + Width =915 + Height =240 + Name ="lab16" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2834 + Top =2095 + Width =741 + TabIndex =19 + Name ="Text19" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1868 + Top =2095 + Width =915 + Height =240 + Name ="lab19" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2834 + Top =2435 + Width =741 + TabIndex =22 + Name ="Text22" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1868 + Top =2435 + Width =915 + Height =240 + Name ="lab22" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2834 + Top =2775 + Width =741 + TabIndex =25 + Name ="Text25" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1868 + Top =2775 + Width =915 + Height =240 + Name ="lab25" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =2834 + Top =3135 + Width =741 + TabIndex =28 + Name ="Text28" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =1868 + Top =3135 + Width =915 + Height =240 + Name ="lab28" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4645 + Top =56 + Width =741 + ColumnWidth =2610 + TabIndex =2 + Name ="Text2" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3634 + Top =56 + Width =960 + Height =240 + Name ="lab2" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4645 + Top =396 + Width =741 + TabIndex =5 + Name ="Text5" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3634 + Top =396 + Width =960 + Height =240 + Name ="lab5" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4645 + Top =737 + Width =741 + TabIndex =8 + Name ="Text8" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3634 + Top =737 + Width =960 + Height =240 + Name ="lab8" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4645 + Top =1077 + Width =741 + TabIndex =11 + Name ="Text11" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3634 + Top =1077 + Width =960 + Height =240 + Name ="lab11" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4645 + Top =1417 + Width =741 + TabIndex =14 + Name ="Text14" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3634 + Top =1417 + Width =960 + Height =240 + Name ="lab14" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4649 + Top =1755 + Width =741 + TabIndex =17 + Name ="Text17" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3638 + Top =1755 + Width =960 + Height =240 + Name ="lab17" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4649 + Top =2095 + Width =741 + TabIndex =20 + Name ="Text20" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3638 + Top =2095 + Width =960 + Height =240 + Name ="lab20" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4649 + Top =2435 + Width =741 + TabIndex =23 + Name ="Text23" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3638 + Top =2435 + Width =960 + Height =240 + Name ="lab23" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4649 + Top =2775 + Width =741 + TabIndex =26 + Name ="Text26" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3638 + Top =2775 + Width =960 + Height =240 + Name ="lab26" + Caption ="FELDNAME" + End + End + End + Begin TextBox + AllowAutoCorrect = NotDefault + SpecialEffect =0 + OverlapFlags =85 + IMESentenceMode =3 + Left =4649 + Top =3135 + Width =741 + TabIndex =29 + Name ="Text29" + + Begin + Begin Label + OverlapFlags =85 + TextAlign =2 + Left =3638 + Top =3135 + Width =960 + Height =240 + Name ="lab29" + Caption ="FELDNAME" + End + End + End + End + End + End +End +CodeBehindForm +' See "frmTest_SQL_Datasheet.cls" diff --git a/source/forms/frmTest_SQL_Datasheet.json b/source/forms/frmTest_SQL_Datasheet.json new file mode 100644 index 0000000..57ba7da --- /dev/null +++ b/source/forms/frmTest_SQL_Datasheet.json @@ -0,0 +1,28 @@ +{ + "Info": { + "Class": "clsDbForm", + "Description": "frmTest_SQL_Datasheet Print Settings" + }, + "Items": { + "Printer": { + "Orientation": "Portrait", + "PaperSize": "A4" + }, + "Margins": { + "LeftMargin": 1.0097, + "TopMargin": 1.0097, + "RightMargin": 1.0097, + "BotMargin": 1.0097, + "DataOnly": false, + "Width": 5, + "Height": 3, + "DefaultSize": true, + "Columns": 1, + "ColumnSpacing": 0.25, + "RowSpacing": 0, + "ItemLayout": "Horizontal Columns", + "FastPrint": 1, + "Datasheet": 1 + } + } +} diff --git a/source/frmConfig_DBMS.frm b/source/frmConfig_DBMS.frm deleted file mode 100644 index 2ae2926..0000000 Binary files a/source/frmConfig_DBMS.frm and /dev/null differ diff --git a/source/frmConfig_DBMS_SF_Data.frm b/source/frmConfig_DBMS_SF_Data.frm deleted file mode 100644 index 919a010..0000000 Binary files a/source/frmConfig_DBMS_SF_Data.frm and /dev/null differ diff --git a/source/frmConfig_LinkTables.frm b/source/frmConfig_LinkTables.frm deleted file mode 100644 index ff22286..0000000 Binary files a/source/frmConfig_LinkTables.frm and /dev/null differ diff --git a/source/frmTest_SQL.frm b/source/frmTest_SQL.frm deleted file mode 100644 index e0806d2..0000000 Binary files a/source/frmTest_SQL.frm and /dev/null differ diff --git a/source/frmTest_SQL_Datasheet.frm b/source/frmTest_SQL_Datasheet.frm deleted file mode 100644 index 8d9ca0d..0000000 Binary files a/source/frmTest_SQL_Datasheet.frm and /dev/null differ diff --git a/source/macros/Autoexec.macro b/source/macros/Autoexec.macro new file mode 100644 index 0000000..09dd41f --- /dev/null +++ b/source/macros/Autoexec.macro @@ -0,0 +1,18 @@ +Version =196611 +ColumnsShown =0 +Begin + Action ="RunCode" + Comment ="base/Autoexec.macro" + Argument ="CheckApplicationStartUpMethod()" +End +Begin + Comment ="_AXL:\015\012<codelib><file>" +End +Begin + Comment ="_AXL:base/Autoexec.macro</file></codelib>CheckApplicationStartUpMethod()" +End diff --git a/source/codelib/_codelib/addins/shared/ACLibGitHubImporter.cls b/source/modules/ACLibGitHubImporter.cls similarity index 98% rename from source/codelib/_codelib/addins/shared/ACLibGitHubImporter.cls rename to source/modules/ACLibGitHubImporter.cls index 97ff63d..7cb53d6 100644 --- a/source/codelib/_codelib/addins/shared/ACLibGitHubImporter.cls +++ b/source/modules/ACLibGitHubImporter.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -77,24 +77,24 @@ End Property ' Sub: UpdateCodeModules '--------------------------------------------------------------------------------------- Public Sub UpdateCodeModules() - + Dim SelectSql As String Dim IsFirstRecord As Boolean - + SelectSql = "select id, url from usys_Appfiles where url > ''" - + With CreateObject("ADODB.Recordset") .CursorLocation = 3 'adUseClient .Open SelectSql, CodeProject.Connection, 1, 1 ' 1 = adOpenKeyset, 1 = adLockReadOnly Set .ActiveConnection = Nothing - + IsFirstRecord = True Do While Not .EOF UpdateCodeModuleInTable .Fields(0).Value, .Fields(1).Value, IsFirstRecord If IsFirstRecord Then IsFirstRecord = False .MoveNext Loop - + .Close End With @@ -106,9 +106,9 @@ Private Sub UpdateCodeModuleInTable(ByVal ModuleName As String, ByVal ACLibPath Dim TempFile As String Dim DownLoadUrl As String Dim BranchName As String - + TempFile = FileTools.TempPath & ModuleName & FileTools.GetFileExtension(ACLibPath, True) - + If UseDraftBranch Then BranchName = "draft" Else @@ -116,7 +116,7 @@ Private Sub UpdateCodeModuleInTable(ByVal ModuleName As String, ByVal ACLibPath End If DownLoadUrl = Replace(GitHubContentBaseUrl, "{branch}", BranchName) DownLoadUrl = Replace(DownLoadUrl, "{path}", ACLibPath) - + DownloadFileFromWeb DownLoadUrl, TempFile CurrentApplication.SaveAppFile ModuleName, TempFile, False, "SccRev", Me.RevisionString(Requery) Kill TempFile @@ -138,18 +138,18 @@ Private Function GetLastCommitFromWeb() As Date Else CommitUrl = CommitUrl & "master" End If - + Const RevisionTag As String = "Revision " Dim JsonString As String JsonString = GetJsonString(CommitUrl) - + Dim LastCommitPos As Long LastCommitPos = InStr(1, JsonString, """committer"":") LastCommitPos = InStr(LastCommitPos, JsonString, """date"":") + Len("date"": """) '"date": "2023-05-14T09:34:04Z" LastCommitInfo = Mid(JsonString, LastCommitPos, Len("2023-05-14T09:34:04")) - + GetLastCommitFromWeb = CDate(Replace(LastCommitInfo, "T", " ")) End Function @@ -158,7 +158,7 @@ Private Function GetJsonString(ByVal ApiUrl As String) As String Dim ApiResponse As String Dim json As Object - + Dim xml As Object ' MSXML2.XMLHTTP60 Set xml = CreateObject("MSXML2.XMLHTTP.6.0") @@ -169,7 +169,7 @@ Private Function GetJsonString(ByVal ApiUrl As String) As String DoEvents Wend ApiResponse = xml.responseText - + GetJsonString = ApiResponse End Function @@ -179,7 +179,7 @@ Private Sub OpenIEandLoadHtmlDoc(ByVal Url As String, ByRef IE As Object, ByRef Dim TimeOut As Long Dim RunInTimeOut As Boolean Dim ErrHdlCnt As Long - + Dim ErrNumber As Long Dim ErrDescription As String @@ -197,16 +197,16 @@ On Error Resume Next On Error GoTo 0 Err.Raise ErrNumber, "ACLibWebImporter.OpenIEandLoadHtmlDoc", ErrDescription End If - + On Error GoTo 0 - + With IE TimeOut = Timer + 10 Do While .Busy And (Not RunInTimeOut) DoEvents If Timer > TimeOut Then RunInTimeOut = True Loop - + If Not RunInTimeOut Then .Visible = 0 .navigate Url @@ -216,7 +216,7 @@ On Error GoTo 0 If Timer > TimeOut Then RunInTimeOut = True Loop End If - + If RunInTimeOut Then On Error Resume Next IE.Quit @@ -224,9 +224,9 @@ On Error GoTo 0 On Error GoTo 0 Err.Raise vbObjectError, "OpenIEandLoadHtmlDoc", "Time-Out beim Laden von '" & Url & "'" End If - + Set HtmlDoc = IE.Document - + End With End Sub diff --git a/source/codelib/data/ado/AdodbHandler.cls b/source/modules/AdodbHandler.cls similarity index 95% rename from source/codelib/data/ado/AdodbHandler.cls rename to source/modules/AdodbHandler.cls index 121ede4..397efee 100644 --- a/source/codelib/data/ado/AdodbHandler.cls +++ b/source/modules/AdodbHandler.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -92,7 +92,7 @@ Public Event ErrorEmptyConnectionString(ByVal Msg As String, ByRef NewConnection ' New values can be passed on via the ByRef parameters. ' '--------------------------------------------------------------------------------------- -Public Event HookInsertIdentityReturn(ByRef InsertSQL As String, ByRef IdentityTable As String, _ +Public Event HookInsertIdentityReturn(ByRef InsertSql As String, ByRef IdentityTable As String, _ ByRef ActiveConnection As ADODB.Connection, ByRef IdentitySelectString As String, _ ByRef HookResponseMode As Long, ByRef HookResponseMessage As Variant) @@ -279,7 +279,7 @@ Public Function ExecuteCommand(ByVal CmdText As String, _ Optional ByVal CmdParamDefs As Variant, _ Optional ByRef RecordsAffected As Long, _ Optional ByVal Options As Long = -1) As ADODB.Recordset - + Dim cmd As ADODB.Command Dim ParamDefsArraySize As Long Dim i As Long @@ -287,11 +287,11 @@ Public Function ExecuteCommand(ByVal CmdText As String, _ Set cmd = New ADODB.Command With cmd - + Set .ActiveConnection = Me.CurrentConnection .CommandText = CmdText .CommandType = CmdType - + If Not IsMissing(CmdParamDefs) Then ParamDefsArraySize = UBound(CmdParamDefs, 1) For i = 0 To ParamDefsArraySize @@ -301,9 +301,9 @@ Public Function ExecuteCommand(ByVal CmdText As String, _ End If Next i End If - + Set ExecuteCommand = .Execute(RecordsAffected, , Options) - + End With Set cmd = Nothing @@ -333,11 +333,11 @@ Public Function OpenRecordset(ByVal Source As String, _ Optional ByVal DisconnectedRecordset As Boolean = False) As ADODB.Recordset Dim rst As ADODB.Recordset - + If CursorLocation = -1 Then CursorLocation = m_DefaultCursorLocation End If - + If DisconnectedRecordset Then If CursorLocation = adUseServer Then CursorLocation = adUseClient @@ -351,14 +351,14 @@ Public Function OpenRecordset(ByVal Source As String, _ With rst .CursorLocation = CursorLocation .Open Source, Me.CurrentConnection, CursorType, LockType - + If DisconnectedRecordset Then Set .ActiveConnection = Nothing End If - + End With Set OpenRecordset = rst - + End Function '--------------------------------------------------------------------------------------- @@ -392,12 +392,12 @@ Public Function OpenRecordsetCommandParam(ByVal CmdText As String, _ Optional ByVal DisconnectedRecordset As Boolean = False) As ADODB.Recordset Dim rst As ADODB.Recordset - + Set rst = ExecuteCommand(CmdText, CmdType, CmdParamDefs, RecordsAffected, Options) If DisconnectedRecordset Then Set rst.ActiveConnection = Nothing End If - + Set OpenRecordsetCommandParam = rst End Function @@ -442,7 +442,7 @@ On Error GoTo HandleErr ExitHere: Exit Function - + HandleErr: If Not (rst Is Nothing) Then rst.Close @@ -473,30 +473,15 @@ Public Function Lookup(ByVal Expr As String, ByVal Domain As String, _ Optional ByVal Criteria As Variant, _ Optional ByVal ValueIfNull As Variant = Null) As Variant - Dim SelectSql As String + Dim SelectSqlText As String - SelectSql = BuildSelectSql(Expr, Domain, Criteria, False) - Lookup = Me.LookupSql(SelectSql, , ValueIfNull) - -End Function - -Private Function BuildSelectSql(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant, _ - Optional ByVal Distinct As Boolean = False) - - Dim SelectSql As String - - SelectSql = "SELECT " - If Distinct Then - SelectSql = SelectSql & "Distinct " - End If - SelectSql = SelectSql & Expr & " FROM (" & Domain & ")" + SelectSqlText = "SELECT " & Expr & " FROM " & Domain If Not (VarType(Criteria) = vbError) Then If Len(Criteria) > 0 Then - SelectSql = SelectSql & " WHERE " & Criteria + SelectSqlText = SelectSqlText & " WHERE " & Criteria End If End If - - BuildSelectSql = SelectSql + Lookup = Me.LookupSql(SelectSqlText, , ValueIfNull) End Function @@ -515,18 +500,8 @@ End Function ' Long ' '--------------------------------------------------------------------------------------- -Public Function Count(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant, _ - Optional ByVal Distinct As Boolean = False) As Long - - If Distinct Then - If Expr <> "*" Then - Domain = "(" & BuildSelectSql(Expr, Domain, Criteria, True) & ")" - Criteria = vbNullString - End If - End If - +Public Function Count(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant) As Long Count = Nz(Me.Lookup("Count(" & Expr & ")", Domain, Criteria), 0) - End Function '--------------------------------------------------------------------------------------- @@ -629,30 +604,30 @@ End Function ' Works for Jet only from Jet 4.0 (Access 2000), IdentityTable is only applicable for MSSQL, under MySQL the IDENT_CURRENT function does not exist. ' '--------------------------------------------------------------------------------------- -Public Function InsertIdentityReturn(ByVal InsertSQL As String, Optional ByVal IdentityTable As String = vbNullString) As Variant +Public Function InsertIdentityReturn(ByVal InsertSql As String, Optional ByVal IdentityTable As String = vbNullString) As Variant Dim cnn As ADODB.Connection Dim rst As ADODB.Recordset Dim RecordsAffected As Long Dim IdentitySql As String - + Dim CurrentHookResumeMode As Long Dim CurrentHookResumeMessage As Variant Set cnn = Me.CurrentConnection - + If m_HooksEnabled Then - RaiseEvent HookInsertIdentityReturn(InsertSQL, IdentityTable, cnn, IdentitySql, CurrentHookResumeMode, CurrentHookResumeMessage) + RaiseEvent HookInsertIdentityReturn(InsertSql, IdentityTable, cnn, IdentitySql, CurrentHookResumeMode, CurrentHookResumeMessage) If CurrentHookResumeMode <> 0 Then 'Hook ermittelte bereits das Ergebnis InsertIdentityReturn = CurrentHookResumeMessage Exit Function End If End If - - cnn.Execute InsertSQL, RecordsAffected - + + cnn.Execute InsertSql, RecordsAffected + If RecordsAffected = 0 Then - InsertIdentityReturn = Null 'es wurde kein neuer DS angefügt + InsertIdentityReturn = Null 'es wurde kein neuer DS angefügt Exit Function End If diff --git a/source/codelib/_codelib/addins/shared/AppFileCodeModulTransfer.cls b/source/modules/AppFileCodeModulTransfer.cls similarity index 98% rename from source/codelib/_codelib/addins/shared/AppFileCodeModulTransfer.cls rename to source/modules/AppFileCodeModulTransfer.cls index 41b4f0f..5c83592 100644 --- a/source/codelib/_codelib/addins/shared/AppFileCodeModulTransfer.cls +++ b/source/modules/AppFileCodeModulTransfer.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -64,7 +64,7 @@ End Property ' '--------------------------------------------------------------------------------------- Public Sub TransferCodeModules(ParamArray CodeModulNames() As Variant) - + Dim i As Long Dim ArrSize As Long @@ -86,11 +86,11 @@ End Sub ' '--------------------------------------------------------------------------------------- Public Function ReplaceCodeModules(ParamArray CodeModulNames() As Variant) As Boolean - + Dim i As Long Dim ArrSize As Long Dim vbp As Object 'VBProject - + 'VBProject of the application: Set vbp = VbeTools.CurrentVbProject @@ -98,19 +98,19 @@ Public Function ReplaceCodeModules(ParamArray CodeModulNames() As Variant) As Bo If Not (vbp Is Nothing) Then ArrSize = UBound(CodeModulNames) For i = 0 To ArrSize - + If CheckCodeModule(CodeModulNames(i)) And (UseVbComponentsImport = False) Then - 'Modul löschen + 'Modul löschen vbp.VBComponents.Remove vbp.VBComponents(CodeModulNames(i)) End If - + 'Module aktualisieren TransferCodeModul CurrentProject, acModule, CodeModulNames(i) - + Next ReplaceCodeModules = True End If - + Set vbp = Nothing End Function @@ -129,7 +129,7 @@ End Function ' '--------------------------------------------------------------------------------------- Public Function CheckCodeModules(ParamArray CodeModulNames() As Variant) As Boolean - + Dim i As Long Dim ModulesExists As Boolean Dim ArrSize As Long @@ -139,7 +139,7 @@ Public Function CheckCodeModules(ParamArray CodeModulNames() As Variant) As Bool For i = 0 To ArrSize ModulesExists = ModulesExists And CheckCodeModule(CodeModulNames(i), False) Next - + CheckCodeModules = ModulesExists End Function @@ -160,7 +160,7 @@ End Function '--------------------------------------------------------------------------------------- Public Function CheckCodeModule(ByVal CodeModulName As String, _ Optional ByVal TransferMissingModule As Boolean = False) As Boolean - + Dim rst As DAO.Recordset Dim IsMissing As Boolean @@ -168,12 +168,12 @@ Public Function CheckCodeModule(ByVal CodeModulName As String, _ IsMissing = rst.EOF rst.Close Set rst = Nothing - + If IsMissing And TransferMissingModule Then TransferCodeModul CurrentProject, acModule, CodeModulName IsMissing = False End If - + CheckCodeModule = Not IsMissing End Function @@ -194,7 +194,7 @@ Public Sub TransferCodeModul(ByVal TargetProject As Access.CurrentProject, _ ByVal ObjType As AcObjectType, ByVal CodeModulName As String) Dim FileName As String - + FileName = FileTools.GetNewTempFileName CurrentApplication.CreateAppFile CodeModulName, FileName If UseVbComponentsImport And ObjType = acModule Then @@ -215,12 +215,12 @@ Public Sub TransferCodeModul(ByVal TargetProject As Access.CurrentProject, _ TargetProject.Application.LoadFromText ObjType, CodeModulName, FileName End If Kill FileName - - + + End Sub Private Sub ConvertToSaveAsTextFile(ByVal FilePath As String) - + Const SEARCHSTRING_ATTRIBUTNAME_BEGIN As String = "Attribute VB_Name = """ Dim Pos As Long @@ -233,23 +233,23 @@ Private Sub ConvertToSaveAsTextFile(ByVal FilePath As String) CheckString = String$(LOF(FileNumber), 0) Get FileNumber, , CheckString Close FileNumber - + Pos = InStr(1, CheckString, SEARCHSTRING_ATTRIBUTNAME_BEGIN) If Pos <= 1 Then Exit Sub End If - + CheckString = Mid(CheckString, Pos) - + NewFile = FilePath & "_SaT" FileNumber = FreeFile Open NewFile For Binary Access Write As FileNumber Put FileNumber, , CheckString Close FileNumber - + Kill FilePath Name NewFile As FilePath - + End Sub Private Property Get CurrentCodeModulWriter() As CodeModuleWriter diff --git a/source/codelib/base/ApplicationHandler.cls b/source/modules/ApplicationHandler.cls similarity index 99% rename from source/codelib/base/ApplicationHandler.cls rename to source/modules/ApplicationHandler.cls index 85b4446..9306eba 100644 --- a/source/codelib/base/ApplicationHandler.cls +++ b/source/modules/ApplicationHandler.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -66,12 +66,12 @@ Private Const SYSCOLOR_COLOR_APPWORKSPACE As Long = 12 Private Declare PtrSafe Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _ ByVal HWnd1 As Long, ByVal HWnd2 As Long, _ ByVal Lpsz1 As String, ByVal Lpsz2 As String) As Long - + Private Declare PtrSafe Function CreateSolidBrush Lib "gdi32.dll" (ByVal CrColor As Long) As Long Private Declare PtrSafe Function SetClassLong Lib "user32" Alias "SetClassLongA" ( _ ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long - + Private Declare PtrSafe Function RedrawWindow Lib "user32" ( _ ByVal Hwnd As Long, LprcUpdate As Any, _ ByVal HrgnUpdate As Long, ByVal FuRedraw As Long) As Long @@ -83,12 +83,12 @@ Private Declare PtrSafe Function GetSysColor Lib "user32" (ByVal NumIndex As Lon Private Declare Function FindWindowEx Lib "user32.dll" Alias "FindWindowExA" ( _ ByVal HWnd1 As Long, ByVal HWnd2 As Long, _ ByVal Lpsz1 As String, ByVal Lpsz2 As String) As Long - + Private Declare Function CreateSolidBrush Lib "gdi32.dll" (ByVal CrColor As Long) As Long Private Declare Function SetClassLong Lib "user32" Alias "SetClassLongA" ( _ ByVal Hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long - + Private Declare Function RedrawWindow Lib "user32" ( _ ByVal Hwnd As Long, LprcUpdate As Any, _ ByVal HrgnUpdate As Long, ByVal FuRedraw As Long) As Long @@ -141,12 +141,12 @@ Public Event ExtensionProcedureCall(ByVal Key As String, ByVal ProcedureName As Public Event AppFileBeforeCreateFile( _ ByVal sFileID As String, ByVal sFileName As String, _ ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant) - + Public Event AppFileBeforeSaveFile( _ ByVal sFileID As String, ByVal sFileName As String, ByVal SaveVersion As Boolean, _ ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant, _ ByVal ExtFieldName As String, ByVal ExtFieldValue As Variant) - + Public Event UpdateApplication( _ ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant) @@ -158,7 +158,7 @@ Public Event NewVersionExists( _ Public Event BeforeOpenStartForm( _ ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant) - + Public Event BeforeStartApplication( _ ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant) @@ -184,28 +184,28 @@ On Error Resume Next End Sub Public Sub Dispose(Optional ByRef ResumeMode As ApplicationHandlerResumeModes, Optional ByRef ResumeMessage As Variant) - + Dim TempResumeMode As ApplicationHandlerResumeModes Dim TempResumeMessage As Variant - + On Error Resume Next - + RaiseEvent BeforeDispose(TempResumeMode, TempResumeMessage) If TempResumeMode = AppResumeMode_Cancel Then ResumeMode = TempResumeMode ResumeMessage = TempResumeMessage Exit Sub End If - + Set m_AppDb = Nothing - + m_Disposed = True - + RaiseEvent AfterDispose(TempResumeMode, TempResumeMessage) - + ResumeMode = AppResumeMode_Completed ResumeMessage = TempResumeMessage - + End Sub '--------------------------------------------------------------------------------------- @@ -223,11 +223,11 @@ End Sub ' '--------------------------------------------------------------------------------------- Public Function Start(Optional ByRef ResumeMessage As Variant) As Boolean - + Dim CurrentStartFormName As String Dim EventResumeMode As ApplicationHandlerResumeModes Dim EventResumeMessage As Variant - + 'Event interface for application start ' ... enables e.g. the execution of a login process RaiseEvent BeforeStartApplication(EventResumeMode, EventResumeMessage) @@ -257,7 +257,7 @@ Public Function Start(Optional ByRef ResumeMessage As Variant) As Boolean Exit Function End If End If - + 'Event interface for start form '... allows changing the start form by means of extensions ' e.g. if a user-specific form is to be opened @@ -274,7 +274,7 @@ Public Function Start(Optional ByRef ResumeMessage As Variant) As Boolean Case Else CurrentStartFormName = Me.ApplicationStartFormName End Select - + If Len(CurrentStartFormName) > 0 Then DoCmd.OpenForm CurrentStartFormName End If @@ -357,9 +357,9 @@ Public Property Get Version() As String '**/ m_APPLICATIONVERSION = "" End If - + Version = m_APPLICATIONVERSION - + End Property Public Property Let Version(ByVal AppVersion As String) @@ -440,7 +440,7 @@ Friend Sub SetAppIcon(ByVal AppIconFile As String, Optional ByVal UseAppIconForF SetAppDbProperty DBPROPNAME_APPICON, dbText, AppIconFile SetAppDbProperty DBPROPNAME_USE_APPICON_FOR_FRMRPT, dbBoolean, UseAppIconForFrmRpt Else - '1. Prüfen ob AppFile-Erweiterung vorhanden ist + '1. Prüfen ob AppFile-Erweiterung vorhanden ist RaiseEvent CheckExtension(EXTENSION_KEY_APPFILE, CheckVar) If CheckVar Then CheckVar = CreateAppFile("AppIcon", AppIconFile) @@ -478,10 +478,10 @@ Public Sub SetApplicationProperty(ByVal PropName As String, ByVal PropValue As V End Sub Private Sub SetAppDbProperty(ByVal PropName As String, ByVal PropType As Long, ByVal PropValue As Variant) - + Dim db As DAO.Database Dim PropCol As DAO.Properties - + Set db = AppDb Set PropCol = db.Properties If DbPropertyExists(PropCol, PropName) Then @@ -499,13 +499,13 @@ Private Sub SetAppDbProperty(ByVal PropName As String, ByVal PropType As Long, B End Sub Private Sub DeleteAppDbProperty(ByVal PropName As String) - + Dim db As DAO.Database Dim PropCol As DAO.Properties Set db = AppDb Set PropCol = db.Properties - + If DbPropertyExists(PropCol, PropName) Then PropCol.Delete PropName End If @@ -513,7 +513,7 @@ Private Sub DeleteAppDbProperty(ByVal PropName As String) End Sub Private Function DbPropertyExists(ByRef PropCol As DAO.Properties, ByVal PropName As String) As Boolean - + Dim Prop As DAO.Property For Each Prop In PropCol @@ -531,7 +531,7 @@ Private Sub WriteApplicationLogEntry(ByVal Msg As String) Dim FileNo As Long LogFile = CurrentProject.Path & "\" & LOG_FILE - + FileNo = FreeFile Open LogFile For Append As FileNo Print #FileNo, Msg @@ -548,7 +548,7 @@ Public Sub WriteLog(ByVal Msg As String, _ Dim EventResumeMessage As Variant RaiseEvent NewAppLog(LogType, Msg, Args, ResumeMode, EventResumeMessage) - + If ResumeMode = 0 And (WriteToFileIfNoEventResponse Or WriteLogToFileIfNoEventResponse Or LogType = AppLogType_Error) Then 'no one has reacted or reported an abort => WriteApplicationLogEntry Msg = Now() & ": " & Msg @@ -652,7 +652,7 @@ Public Function NewerAppVersionExists() As Boolean Dim ResumeMode As ApplicationHandlerResumeModes Dim ResumeMessage As Boolean - + RaiseEvent NewVersionExists(ResumeMode, ResumeMessage) NewerAppVersionExists = ResumeMessage @@ -661,7 +661,7 @@ End Function Private Function CheckVersionUpdate() As Boolean ' True = Update required - + Dim EventResumeMode As ApplicationHandlerResumeModes Dim EventResumeMessage As Variant @@ -710,17 +710,17 @@ Public Function GetExtensionInstance(ByVal ExtensionKey As String, Optional ByVa RaiseEvent ExtensionInstance(ExtensionKey, InstanceKey, ExtRef) Set GetExtensionInstance = ExtRef - + End Function Public Function GetExtensionProperty(ByVal ExtensionKey As String, ByVal PropertyName As String, _ Optional ByVal ValueIfMissing As Variant = Empty) As Variant - + Dim EventResumeMode As ApplicationHandlerResumeModes Dim EventResumeMessage As Variant RaiseEvent ExtensionPropertyLookup(ExtensionKey, PropertyName, EventResumeMode, EventResumeMessage) - + If EventResumeMode = AppResumeMode_Completed Then GetExtensionProperty = EventResumeMessage Else @@ -731,7 +731,7 @@ End Function Public Function UpdateApplication() As Boolean ' True = Close application - + ' => Outsourced to extension: this makes the usage more flexible ' and everyone can choose which update method to follow @@ -764,7 +764,7 @@ End Function Public Sub CallExtensionProcedure(ByVal Key As String, ByVal ProcedureName As String, _ ByRef ResumeMode As ApplicationHandlerResumeModes, ByRef ResumeMessage As Variant, _ ByRef Params() As Variant) - + RaiseEvent ExtensionProcedureCall(Key, ProcedureName, ResumeMode, ResumeMessage, Params) - + End Sub diff --git a/source/codelib/base/ApplicationHandler_AppFile.cls b/source/modules/ApplicationHandler_AppFile.cls similarity index 97% rename from source/codelib/base/ApplicationHandler_AppFile.cls rename to source/modules/ApplicationHandler_AppFile.cls index f4c3baf..7b142aa 100644 --- a/source/codelib/base/ApplicationHandler_AppFile.cls +++ b/source/modules/ApplicationHandler_AppFile.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -7,7 +7,7 @@ Attribute VB_GlobalNameSpace = False Attribute VB_Creatable = False Attribute VB_PredeclaredId = False Attribute VB_Exposed = False -Attribute VB_Description = "Erweiterung für ApplicationHandler-Klasse: Anwendungsspezifische Dateien verwalten" +Attribute VB_Description = "Erweiterung für ApplicationHandler-Klasse: Anwendungsspezifische Dateien verwalten" '--------------------------------------------------------------------------------------- ' Class: base.ApplicationHandler_File '--------------------------------------------------------------------------------------- @@ -108,10 +108,10 @@ Private Sub GetExtensionPropertyLookup(ByVal PropertyName As String, _ Select Case PropertyName Case EXTENSION_PROPERTY_APPFILETABLENAME ResumeMessage = TABLE_APPFILES - + Case Else 'Property wurde nicht erkannt ResumeMode = AppResumeMode_Error - + End Select End Sub @@ -142,34 +142,34 @@ Public Function CreateAppFile(ByVal FileID As String, ByVal FileName As String) With CodeDb.OpenRecordset("select " & TABLE_FIELD_FILE & " from " & TABLE_APPFILES & " where " & TABLE_FIELD_ID & "='" & Replace(FileID, "'", "''") & "'") If Not .EOF Then - + Set fld = .Fields(0) FieldSize = fld.FieldSize - + If FieldSize > 0 Then ReDim Binfile(FieldSize - 1) Binfile = fld.GetChunk(0, FieldSize) CreateFileFromByteArray FileName, Binfile CreateAppFile = True End If - + End If .Close End With - + End Function Private Sub CreateFileFromByteArray(ByVal FileName As String, ByRef Binfile() As Byte) - + Dim FileNo As Integer - + FileTools.CreateDirectoryIfMissing FileTools.GetDirFromFullFileName(FileName) FileNo = FreeFile Open FileName For Binary As #FileNo Put #FileNo, , Binfile() Close #FileNo - + End Sub '--------------------------------------------------------------------------------------- @@ -200,7 +200,7 @@ Public Function SaveAppFile(ByVal FileID As String, ByVal FileName As String, _ Dim Version As String Dim FileInfo As WinApiFileInfo Dim SelectSql As String - + On Error GoTo HandleErr FileNo = FreeFile @@ -243,20 +243,20 @@ On Error GoTo HandleErr End If rst.Fields(TABLE_FIELD_VERSION) = Version End If - + If Len(ExtFieldName) > 0 Then rst.Fields(ExtFieldName).Value = ExtFieldValue End If - + rst.Update rst.Close Set rst = Nothing - + SaveAppFile = True ExitHere: Exit Function - + HandleErr: Dim TabCreateErrCnt As Long Dim ErrNumber As Long, ErrDescription As String @@ -277,7 +277,7 @@ HandleErr: End Function Private Function CreateAppFileTable() As Boolean - + Dim CreateTableSql As String CreateTableSql = "create table " & TABLE_APPFILES & " ( " & TABLE_FIELD_ID & " varchar(20) primary key, " & _ @@ -302,10 +302,10 @@ Private Sub m_ApplicationHandler_AppFileBeforeCreateFile(ByVal FileID As String, Completed = CreateAppFile(FileID, FileName) If Completed Then ResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Completed - Else 'Fehler rückmelden + Else 'Fehler rückmelden ResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Error End If - + End Sub ' AppFileBeforeSaveFile @@ -322,5 +322,5 @@ Private Sub m_ApplicationHandler_AppFileBeforeSaveFile(ByVal FileID As String, B Else 'resume error ResumeMode = ApplicationHandlerResumeModes.AppResumeMode_Error End If - + End Sub diff --git a/source/codelib/base/ApplicationHandler_ExtensionCollection.cls b/source/modules/ApplicationHandler_ExtensionCollection.cls similarity index 99% rename from source/codelib/base/ApplicationHandler_ExtensionCollection.cls rename to source/modules/ApplicationHandler_ExtensionCollection.cls index 66233f5..eb765b0 100644 --- a/source/codelib/base/ApplicationHandler_ExtensionCollection.cls +++ b/source/modules/ApplicationHandler_ExtensionCollection.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -88,7 +88,7 @@ Public Sub Add(ByVal ExtensionRef As Object) End Sub Public Sub Dispose() - + Dim MaxCnt As Long Dim CheckCnt As Long diff --git a/source/codelib/base/ApplicationHandler_Version.cls b/source/modules/ApplicationHandler_Version.cls similarity index 98% rename from source/codelib/base/ApplicationHandler_Version.cls rename to source/modules/ApplicationHandler_Version.cls index 6299eb5..dacb8fb 100644 --- a/source/codelib/base/ApplicationHandler_Version.cls +++ b/source/modules/ApplicationHandler_Version.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -80,11 +80,11 @@ Private Sub m_ApplicationHandler_ExtensionProcedureCall(ByVal ExtensionKeyToChec If ExtensionKeyToCheck <> EXTENSION_KEY Then Exit Sub End If - + On Error GoTo HandleErr - + ResumeMode = AppResumeMode_Completed - + Select Case ProcedureName Case "NewVersionExists" ResumeMessage = NewVersionExists(ProcParams(0), ProcParams(1)) @@ -93,11 +93,11 @@ On Error GoTo HandleErr End Select Exit Sub - + HandleErr: ResumeMode = AppResumeMode_Error ResumeMessage = Err.Description - + End Sub 'ExtensionPropertyLookup @@ -120,7 +120,7 @@ End Sub Public Function NewVersionExists(Optional ByRef NewVersion As Variant, Optional ByRef VersionRemarks As Variant) As Boolean NewVersionExists = (CheckVersion(NewVersion, VersionRemarks) = VerState_Newer) - + End Function @@ -135,11 +135,11 @@ Private Sub GetExtensionPropertyLookup(ByVal PropertyName As String, _ ResumeMode = AppResumeMode_Completed Select Case PropertyName - + Case Else 'Property was not recognized ResumeMode = AppResumeMode_Error ResumeMessage = "Property '" & PropertyName & "' is not supported" - + End Select End Sub @@ -162,10 +162,10 @@ Public Function CheckVersion(Optional ByRef NewVersion As Variant, Optional ByRe Dim DownloadVersion As String Dim DownloadVersionRemarks As String - + DownloadVersion = GetVersionFromDownloadSource(XmlVersionCheckFile, DownloadVersionRemarks) CheckVersion = CompareVersions(m_ApplicationHandler.Version, DownloadVersion) - + If CheckVersion = VerState_Newer Then NewVersion = DownloadVersion VersionRemarks = DownloadVersionRemarks @@ -184,13 +184,13 @@ End Property Private Function GetVersionFromDownloadSource(ByVal XmlFile As String, ByRef VersionRemarks As String) As String Dim XmlDoc As Object ' MSXML2.DOMDocument60 - + Set XmlDoc = CreateObject("MSXML.DOMDocument") 'New MSXML2.DOMDocument60 XmlDoc.async = False If Not XmlDoc.Load(XmlFile) Then Err.Raise XmlDoc.parseError.errorCode, , XmlDoc.parseError.Reason End If - + GetVersionFromDownloadSource = XmlDoc.getElementsByTagName("version").Item(0).Text VersionRemarks = XmlDoc.getElementsByTagName("remarks").Item(0).Text @@ -204,7 +204,7 @@ Private Function GetVersionNumbers(ByVal VersionString As String) As Long() VersionNumberStrings = Split(VersionString, ".") ReDim VersionNumbers(UBound(VersionNumberStrings)) - + Dim i As Long For i = LBound(VersionNumberStrings) To UBound(VersionNumberStrings) VersionNumbers(i) = Val(VersionNumberStrings(i)) @@ -218,18 +218,18 @@ Private Function CompareVersions(ByVal BaseVersion As String, ByVal NewVersion A Dim BaseVersionNumbers() As Long Dim NewVersionNumbers() As Long - + BaseVersionNumbers = GetVersionNumbers(BaseVersion) NewVersionNumbers = GetVersionNumbers(NewVersion) - + Dim i As Long - + Dim MaxIndex As Long MaxIndex = UBound(NewVersionNumbers) If UBound(BaseVersionNumbers) < MaxIndex Then MaxIndex = UBound(BaseVersionNumbers) End If - + For i = LBound(NewVersionNumbers) To MaxIndex If BaseVersionNumbers(i) <> NewVersionNumbers(i) Then CompareVersions = -1 + 2 * Abs(BaseVersionNumbers(i) > NewVersionNumbers(i)) diff --git a/source/CodeModulSupport.bas b/source/modules/CodeModulSupport.bas similarity index 97% rename from source/CodeModulSupport.bas rename to source/modules/CodeModulSupport.bas index db4f798..eec9b21 100644 --- a/source/CodeModulSupport.bas +++ b/source/modules/CodeModulSupport.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "CodeModulSupport" +Attribute VB_Name = "CodeModulSupport" Option Compare Database Option Explicit @@ -12,14 +12,14 @@ Public Sub CheckConditionalCompilationArgumentsString(ByVal UseLoginForm As Bool Dim TestString As String Dim ArgExists As Boolean Dim i As Long - + ConditionalCompilationArgumentsString = Trim(Nz(Application.GetOption(ConditionalCompilationArgumentsOptionName), vbNullString)) - + If Len(ConditionalCompilationArgumentsString) = 0 And UseLoginForm Then Application.SetOption ConditionalCompilationArgumentsOptionName, CONFIG_USELOGINFORM_ArgName & " = " & Abs(UseLoginForm) Exit Sub End If - + ConditionalCompilationArguments = GetConditionalCompilationArgumentsArray(ConditionalCompilationArgumentsString) For i = LBound(ConditionalCompilationArguments) To UBound(ConditionalCompilationArguments) If Replace(ConditionalCompilationArguments(i), " ", vbNullString) Like CONFIG_USELOGINFORM_ArgName & "=*" Then @@ -28,13 +28,13 @@ Public Sub CheckConditionalCompilationArgumentsString(ByVal UseLoginForm As Bool Exit For End If Next - + If ArgExists Then ConditionalCompilationArgumentsString = Join(ConditionalCompilationArguments, ":") Else ConditionalCompilationArgumentsString = ConditionalCompilationArgumentsString & " : " & CONFIG_USELOGINFORM_ArgName & " = " & Abs(UseLoginForm) End If - + ConditionalCompilationArgumentsString = Trim(ConditionalCompilationArgumentsString) If Left(ConditionalCompilationArgumentsString, 1) = ":" Then ConditionalCompilationArgumentsString = Trim(Mid(ConditionalCompilationArgumentsString, 2)) @@ -44,7 +44,7 @@ Public Sub CheckConditionalCompilationArgumentsString(ByVal UseLoginForm As Bool End If Application.SetOption ConditionalCompilationArgumentsOptionName, ConditionalCompilationArgumentsString - + End Sub Private Function GetConditionalCompilationArgumentsArray(ByVal FullString As String) As String() diff --git a/source/codelib/_codelib/addins/shared/CodeModuleWriter.cls b/source/modules/CodeModuleWriter.cls similarity index 97% rename from source/codelib/_codelib/addins/shared/CodeModuleWriter.cls rename to source/modules/CodeModuleWriter.cls index 8fb4d24..1a93992 100644 --- a/source/codelib/_codelib/addins/shared/CodeModuleWriter.cls +++ b/source/modules/CodeModuleWriter.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -38,14 +38,14 @@ Option Explicit #Else Private m_CodeModule As Object Private m_CurrentVbProject As Object - + Public Enum vbext_ProcKind vbext_pk_Proc = 0 vbext_pk_Let = 1 vbext_pk_Set = 2 vbext_pk_Get = 3 End Enum - + Public Enum vbext_ComponentType vbext_ct_StdModule = 1 vbext_ct_ClassModule = 2 @@ -69,7 +69,7 @@ Public Property Get CodeModule() As Object #End If Set CodeModule = m_CodeModule - + End Property #If VBIDE_EARLYBINDING Then @@ -95,7 +95,7 @@ Public Sub AddCodeToEventProcedure(ByVal EventName As String, ByVal ObjectName A Dim ProcEndLine As Long Dim CodeCheckLineStart As Long Dim CodeCheckLineEnd As Long - + StartLine = FindEventProcedureBodyLine(EventName, ObjectName, ProcEndLine) If StartLine < 0 Then @@ -105,11 +105,11 @@ Public Sub AddCodeToEventProcedure(ByVal EventName As String, ByVal ObjectName A CodeCheckLineEnd = ProcEndLine CodeExists = m_CodeModule.Find(Code, CodeCheckLineStart, 0, CodeCheckLineEnd, 0, True) End If - + If Not CodeExists Then m_CodeModule.InsertLines StartLine + 1, vbNewLine & Code End If - + End Sub Private Function FindEventProcedureBodyLine(ByVal EventName As String, ByVal ObjectName As String, _ @@ -164,7 +164,7 @@ Friend Property Get CurrentVbProject() As Object If m_CurrentVbProject Is Nothing Then Set m_CurrentVbProject = VbeTools.CurrentVbProject End If - + Set CurrentVbProject = m_CurrentVbProject End Property @@ -194,19 +194,19 @@ Public Sub ImportVbComponent(ByVal ComponentType As vbext_ComponentType, ByVal C End If Next - If CodeModuleExists Then ' überprüfen, ob Typen übereinstimmen + If CodeModuleExists Then ' überprüfen, ob Typen übereinstimmen If vbc.Type <> ComponentType Then VbcCol.Remove vbc Set vbc = Nothing CodeModuleExists = False End If End If - + If Not CodeModuleExists Then Set vbc = VbcCol.Add(ComponentType) vbc.Name = CodeModulName End If - + Set cm = vbc.CodeModule cm.DeleteLines 1, cm.CountOfLines cm.AddFromFile ImportFile @@ -218,8 +218,8 @@ Public Sub ImportVbComponent(ByVal ComponentType As vbext_ComponentType, ByVal C 'End DeleteClassHeaderLinesFromCodeModul cm End If - - 'Leerzeilen am Ende säubern + + 'Leerzeilen am Ende säubern Do While Len(Trim$(cm.Lines(cm.CountOfLines, 1))) = 0 And cm.CountOfLines > 1 cm.DeleteLines cm.CountOfLines Loop @@ -240,10 +240,10 @@ Private Function GetComponentTypeFromFile(ByVal FilePath As String) As vbext_Com CheckString = String$(LOF(FileNumber), 0) Get FileNumber, , CheckString Close FileNumber - - 'Pos von VB_Name ermitteln (= Kennzeichen für Standardmodul oder Klasse) + + 'Pos von VB_Name ermitteln (= Kennzeichen für Standardmodul oder Klasse) Pos = InStr(1, CheckString, SEARCHSTRING_ATTRIBUTNAME_BEGIN) - + 'Typ bestimmen If Pos > 0 Then CmType = vbext_ComponentType.vbext_ct_StdModule diff --git a/source/codelib/data/dao/DaoHandler.cls b/source/modules/DaoHandler.cls similarity index 95% rename from source/codelib/data/dao/DaoHandler.cls rename to source/modules/DaoHandler.cls index 0317c79..0e40b6a 100644 --- a/source/codelib/data/dao/DaoHandler.cls +++ b/source/modules/DaoHandler.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -141,7 +141,7 @@ End Sub '--------------------------------------------------------------------------------------- Public Property Get CurrentDb() As DAO.Database If (m_DaoDb Is Nothing) Then - 'Error-Event auslösen und hoffen, dass neue Referenz geliefert wird + 'Error-Event auslösen und hoffen, dass neue Referenz geliefert wird RaiseEvent ErrorMissingCurrentDb("DaoHandler.CurrentDb: unavailable CurrentDb-Database", m_DaoDb) If (m_DaoDb Is Nothing) Then 'Use CurrentDb of the application if DaoHandler "self-instantiating" (VB_PredeclaredId = True) is used. @@ -189,7 +189,7 @@ Public Function Execute(ByVal Query As String, _ End If Me.CurrentDb.Execute Query, Options Execute = Me.CurrentDb.RecordsAffected - + End Function '--------------------------------------------------------------------------------------- @@ -208,7 +208,7 @@ End Function '--------------------------------------------------------------------------------------- Public Function ExecuteParamSql(ByVal SqlText As String, _ ParamArray QueryParams() As Variant) As Long - + Dim qdf As DAO.QueryDef On Error GoTo HandleErr @@ -218,24 +218,24 @@ On Error GoTo HandleErr Else Set qdf = Me.ParamQueryDefSql(SqlText, QueryParams) End If - + ExecuteParamSql = ExecuteQueryDef(qdf) On Error GoTo 0 qdf.Close Set qdf = Nothing - + ExitHere: Exit Function - + HandleErr: If Not (qdf Is Nothing) Then qdf.Close Set qdf = Nothing End If Err.Raise Err.Number, "ExecuteParamSQL:" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext - + End Function '--------------------------------------------------------------------------------------- @@ -255,11 +255,11 @@ End Function '--------------------------------------------------------------------------------------- Public Function ExecuteQueryDefByName(ByVal QueryName As String, _ ParamArray QueryParams() As Variant) As Long - + Dim qdf As DAO.QueryDef - + On Error GoTo HandleErr - + If IsMissing(QueryParams) Then Set qdf = Me.ParamQueryDefByName(QueryName) Else @@ -272,17 +272,17 @@ On Error GoTo 0 qdf.Close Set qdf = Nothing - + ExitHere: Exit Function - + HandleErr: If Not (qdf Is Nothing) Then qdf.Close Set qdf = Nothing End If Err.Raise Err.Number, "ExecuteParamQdfByName:" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext - + End Function '--------------------------------------------------------------------------------------- @@ -302,28 +302,28 @@ End Function '--------------------------------------------------------------------------------------- Public Function ExecuteQueryDef(ByVal QdfRef As DAO.QueryDef, _ ParamArray QueryParams() As Variant) As Long - + Dim QdfParamDefs() As Variant - + If Not IsMissing(QueryParams) Then QdfParamDefs = GetParamDefArray(QueryParams) FillQueryDefParameters QdfRef, QdfParamDefs End If - + QdfRef.Execute dbFailOnError - + ExecuteQueryDef = QdfRef.RecordsAffected End Function Private Sub FillQueryDefParameters(ByVal QdfRef As DAO.QueryDef, ByVal QdfParamDefs As Variant) - + Dim ParamDefsArraySize As Long Dim ParamIndex As Variant Dim i As Long ParamDefsArraySize = UBound(QdfParamDefs, 1) - + With QdfRef For i = 0 To ParamDefsArraySize ParamIndex = QdfParamDefs(i, 0) @@ -332,7 +332,7 @@ Private Sub FillQueryDefParameters(ByVal QdfRef As DAO.QueryDef, ByVal QdfParamD End If Next i End With - + End Sub '--------------------------------------------------------------------------------------- @@ -354,13 +354,13 @@ Public Function ParamQueryDefByName(ByVal QueryName As String, ParamArray QueryP Dim qdf As DAO.QueryDef Dim QdfParamDefs() As Variant - + Set qdf = Me.CurrentDb.QueryDefs(QueryName) If Not IsMissing(QueryParams) Then QdfParamDefs = GetParamDefArray(QueryParams) FillQueryDefParameters qdf, QdfParamDefs End If - + Set ParamQueryDefByName = qdf End Function @@ -369,7 +369,7 @@ End Function ' Function: ParamQueryDefSql '--------------------------------------------------------------------------------------- ' -' Temporäres QueryDef-Objekt ink. übergebenen Parameterwerten öffnen +' Temporäres QueryDef-Objekt ink. übergebenen Parameterwerten öffnen ' ' Parameters: ' ParamSqlText - SQL statement for the temporary QueryDef object @@ -390,7 +390,7 @@ Public Function ParamQueryDefSql(ByVal ParamSqlText As String, ParamArray QueryP QdfParamDefs = GetParamDefArray(QueryParams) FillQueryDefParameters qdf, QdfParamDefs End If - + Set ParamQueryDefSql = qdf End Function @@ -419,7 +419,7 @@ Public Function OpenRecordset(ByVal Source As String, _ If (RecordsetOptions And dbSeeChanges) = 0 Then RecordsetOptions = RecordsetOptions + dbSeeChanges End If - + ' Replace0WithIsMissing ... so that IsMissing for Variant data type works on original DAO openrecordset Set OpenRecordset = Me.CurrentDb.OpenRecordset(Source, _ Replace0WithIsMissing(RecordsetType), _ @@ -466,29 +466,29 @@ Public Function OpenRecordsetParamSql(ByVal ParamSqlText As String, _ Dim qdf As DAO.QueryDef Dim QdfParamDefs As Variant ' - + QdfParamDefs = GetParamDefArray(QueryParams) - + On Error GoTo HandleErr - + Set qdf = Me.CurrentDb.CreateQueryDef("", ParamSqlText) Set OpenRecordsetParamSql = OpenRecordsetQueryDef(qdf, QdfParamDefs, RecordsetType, Options, LockEdit) - + On Error GoTo 0 qdf.Close Set qdf = Nothing - + ExitHere: Exit Function - + HandleErr: If Not (qdf Is Nothing) Then qdf.Close Set qdf = Nothing End If Err.Raise Err.Number, "OpenRecordsetParamSQL:" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext - + End Function '--------------------------------------------------------------------------------------- @@ -529,56 +529,56 @@ End Function ' '--------------------------------------------------------------------------------------- Public Function GetParamDefArray(ParamArray ParamValues() As Variant) As Variant - + Dim i As Long Dim QdfParamDefs() As Variant Dim ArraySize As Long - Dim ParamValueArray As Variant ' !!! nicht als Array deklarieren, da sonst ParamValueArray = ParamValueArray(0) fehltschlägt, wenn ParamValueArray(0) ein Array ist + Dim ParamValueArray As Variant ' !!! nicht als Array deklarieren, da sonst ParamValueArray = ParamValueArray(0) fehltschlägt, wenn ParamValueArray(0) ein Array ist Dim ArrayDimCnt As Long, SubArrayDimCnt As Long - + ArraySize = UBound(ParamValues) If ArraySize = -1 Then - GetParamDefArray = QdfParamDefs 'nicht dimensionierten Array zurückgeben + GetParamDefArray = QdfParamDefs 'nicht dimensionierten Array zurückgeben Exit Function End If - + ParamValueArray = ParamValues ArrayDimCnt = ArrayDimensionCount(ParamValueArray) If ArrayDimCnt = 2 Then GetParamDefArray = ParamValues Exit Function End If - + SubArrayDimCnt = ArrayDimensionCount(ParamValueArray(0)) If SubArrayDimCnt <> -1 Then - + Do While SubArrayDimCnt <> -1 - + ParamValueArray = ParamValueArray(0) - + If SubArrayDimCnt = 2 Then ' !!! /** \todo CHECK SubArrayDimCnt = 2176 .. ist das immer richtig? **/ 'Bereits aufbereiteter 2-dim. Array GetParamDefArray = ParamValueArray Exit Function End If - + SubArrayDimCnt = ArrayDimensionCount(ParamValueArray(0)) - + Loop - + ArraySize = UBound(ParamValueArray) - + End If - + ReDim QdfParamDefs(ArraySize, 1) For i = 0 To ArraySize QdfParamDefs(i, 0) = i QdfParamDefs(i, 1) = ParamValueArray(i) Next - + GetParamDefArray = QdfParamDefs - + End Function Private Function ArrayDimensionCount(ByRef ArrayToCheck As Variant) As Integer @@ -605,17 +605,17 @@ Private Function ArrayDimensionCount(ByRef ArrayToCheck As Variant) As Integer ' End If ' ' ArrayDimensionCount = lngCnt - + Dim ArraySize As Long Dim DimCnt As Long - + DimCnt = 0 - + If Not IsArray(ArrayToCheck) Then ArrayDimensionCount = -1 Exit Function End If - + On Error Resume Next Do @@ -623,13 +623,13 @@ On Error Resume Next ArraySize = UBound(ArrayToCheck, DimCnt) Loop While Err.Number = 0 Err.Clear - + On Error GoTo 0 - + DimCnt = DimCnt - 1 - + ArrayDimensionCount = DimCnt - + End Function '--------------------------------------------------------------------------------------- @@ -646,33 +646,33 @@ End Function ' '--------------------------------------------------------------------------------------- Public Function GetNamedParamDefArray(ParamArray ParamIndexAndValues() As Variant) As Variant - + Dim i As Long Dim QdfParamDefs() As Variant Dim ArraySize As Long - + ArraySize = UBound(ParamIndexAndValues) If ArraySize = -1 Then - GetNamedParamDefArray = QdfParamDefs 'nicht dimensionierten Array zurückgeben + GetNamedParamDefArray = QdfParamDefs 'nicht dimensionierten Array zurückgeben Exit Function End If - - 'Prüfen, ob immer Paare (Index / Wert) möglich sind + + 'Prüfen, ob immer Paare (Index / Wert) möglich sind If (((ArraySize + 1) \ 2) * 2) <> (ArraySize + 1) Then - Err.Raise vbObjectError, "DaoHandler.GetNamedParamDefArray", "ParamArray muss immer Paare für Parameter-Index und Parameter-Wert enthalten." + Err.Raise vbObjectError, "DaoHandler.GetNamedParamDefArray", "ParamArray muss immer Paare für Parameter-Index und Parameter-Wert enthalten." End If - + ArraySize = ArraySize \ 2 - + ReDim QdfParamDefs(ArraySize, 1) For i = 0 To ArraySize QdfParamDefs(i, 0) = ParamIndexAndValues(i * 2) QdfParamDefs(i, 1) = ParamIndexAndValues(i * 2 + 1) Next - + GetNamedParamDefArray = QdfParamDefs - + End Function '--------------------------------------------------------------------------------------- @@ -702,7 +702,7 @@ Public Function OpenRecordsetQueryDefByName(ByVal QueryName As String, _ Dim qdf As DAO.QueryDef On Error GoTo HandleErr - + Set qdf = Me.CurrentDb.QueryDefs(QueryName) Set OpenRecordsetQueryDefByName = OpenRecordsetQueryDef(qdf, QueryParams, RecordsetType, Options, LockEdit) @@ -710,24 +710,24 @@ On Error GoTo 0 qdf.Close Set qdf = Nothing - + ExitHere: Exit Function - + HandleErr: If Not (qdf Is Nothing) Then qdf.Close Set qdf = Nothing End If Err.Raise Err.Number, "OpenQueryDefRecordsetByName:" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext - + End Function '--------------------------------------------------------------------------------------- ' Function: OpenRecordsetQueryDef '--------------------------------------------------------------------------------------- ' -' Recordset von gespeicherter Abfrage (optional mit Parametern) öffnen +' Recordset von gespeicherter Abfrage (optional mit Parametern) öffnen ' ' Parameters: ' QdfRef - QueryDef reference @@ -746,7 +746,7 @@ Public Function OpenRecordsetQueryDef(ByVal QdfRef As DAO.QueryDef, _ Optional ByVal RecordsetType As DAO.RecordsetTypeEnum, _ Optional ByVal RecordsetOptions As DAO.RecordsetOptionEnum, _ Optional ByVal LockEdit As DAO.LockTypeEnum) As DAO.Recordset - + If Not IsMissing(QueryParams) Then FillQueryDefParameters QdfRef, QueryParams End If @@ -780,30 +780,30 @@ Public Function LookupSql(ByVal SqlText As String, _ Optional ByVal Index As Variant = 0&, _ Optional ByVal ValueIfNull As Variant = Null) As Variant - Dim rst As DAO.Recordset + Dim rst As DAO.Recordset On Error GoTo HandleErr - Set rst = Me.OpenRecordset(SqlText, dbOpenForwardOnly, dbSeeChanges, dbReadOnly) - With rst - If .EOF Then - LookupSql = ValueIfNull - Else - LookupSql = Nz(.Fields(Index), ValueIfNull) - End If - .Close - End With - Set rst = Nothing - + Set rst = Me.OpenRecordset(SqlText, dbOpenForwardOnly, dbSeeChanges, dbReadOnly) + With rst + If .EOF Then + LookupSql = ValueIfNull + Else + LookupSql = Nz(.Fields(Index), ValueIfNull) + End If + .Close + End With + Set rst = Nothing + ExitHere: Exit Function - + HandleErr: If Not (rst Is Nothing) Then rst.Close Set rst = Nothing End If - + Err.Raise Err.Number, "LookupSQL:" & Err.Source, Err.Description, Err.HelpFile, Err.HelpContext End Function @@ -828,30 +828,15 @@ Public Function Lookup(ByVal Expr As String, ByVal Domain As String, _ Optional ByVal Criteria As Variant, _ Optional ByVal ValueIfNull As Variant = Null) As Variant - Dim SelectSql As String - - SelectSql = BuildSelectSql(Expr, Domain, Criteria, False) - Lookup = LookupSql(SelectSql, , ValueIfNull) - -End Function - -Private Function BuildSelectSql(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant, _ - Optional ByVal Distinct As Boolean = False) - - Dim SelectSql As String + Dim SelectSql As String - SelectSql = "SELECT " - If Distinct Then - SelectSql = SelectSql & "Distinct " - End If - SelectSql = SelectSql & Expr & " FROM (" & Domain & ")" - If Not (VarType(Criteria) = vbError) Then - If Len(Criteria) > 0 Then - SelectSql = SelectSql & " WHERE " & Criteria - End If - End If - - BuildSelectSql = SelectSql + SelectSql = "SELECT " & Expr & " FROM (" & Domain & ")" + If Not (VarType(Criteria) = vbError) Then + If Len(Criteria) > 0 Then + SelectSql = SelectSql & " WHERE " & Criteria + End If + End If + Lookup = LookupSql(SelectSql, , ValueIfNull) End Function @@ -870,18 +855,8 @@ End Function ' Long ' '--------------------------------------------------------------------------------------- -Public Function Count(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant, _ - Optional ByVal Distinct As Boolean = False) As Long - - If Distinct Then - If Expr <> "*" Then - Domain = "(" & BuildSelectSql(Expr, Domain, Criteria, True) & ")" - Criteria = vbNullString - End If - End If - - Count = Nz(Me.Lookup("Count(" & Expr & ")", Domain, Criteria), 0) - +Public Function Count(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant) As Long + Count = Nz(Me.Lookup("Count(" & Expr & ")", Domain, Criteria), 0) End Function '--------------------------------------------------------------------------------------- @@ -984,7 +959,7 @@ End Function ' Works for Jet only from Jet 4.0 (Access 2000), IdentityTable is only applicable for MSSQL, under MySQL the IDENT_CURRENT function does not exist. ' ( is more suitable regarding use for active DBMS.) '--------------------------------------------------------------------------------------- -Public Function InsertIdentityReturn(ByVal InsertSQL As String) As Variant +Public Function InsertIdentityReturn(ByVal InsertSql As String) As Variant Dim db As DAO.Database Dim rst As DAO.Recordset @@ -993,11 +968,11 @@ Public Function InsertIdentityReturn(ByVal InsertSQL As String) As Variant On Error GoTo HandleErr Set db = Me.CurrentDb - db.Execute InsertSQL + db.Execute InsertSql RecordsAffected = db.RecordsAffected - + If RecordsAffected = 0 Then - InsertIdentityReturn = Null 'es wurde kein neuer DS angefügt + InsertIdentityReturn = Null 'es wurde kein neuer DS angefügt Exit Function End If @@ -1011,7 +986,7 @@ On Error GoTo HandleErr .Close End With Set rst = Nothing - + ExitHere: Exit Function @@ -1054,7 +1029,7 @@ End Function ' ' Parameters: ' Source - Insert data source -' ReturnFieldNameOrIndex - Datenfeld für Wertrückgabe +' ReturnFieldNameOrIndex - Datenfeld für Wertrückgabe ' FieldsAndValues - ParamArray: "Field1", Value1, "Field2", Value2, .... ' ' Returns: @@ -1076,13 +1051,13 @@ Private Function InsertRecordValuesArrayReturnFieldValue( _ Dim FieldNames() As Variant, FieldValues() As Variant Dim rst As DAO.Recordset Dim ErrNo As Long, ErrDesc As String, ErrSource As String - + On Error GoTo HandleErr lngNum = UBound(FieldsAndValues) - LBound(FieldsAndValues) + 1 'hfArraySize(FieldsAndValues) ReDim FieldNames(lngNum \ 2) ReDim FieldValues(lngNum \ 2) - + anz = 0 For i = 0 To (lngNum - 2) Step 2 FieldNames(anz) = FieldsAndValues(i) @@ -1092,29 +1067,29 @@ On Error GoTo HandleErr Set rst = Me.OpenRecordset(Source, dbOpenDynaset) With rst - + .AddNew i = 0 For i = 0 To (anz - 1) .Fields(FieldNames(i)) = FieldValues(i) Next i .Update - + If Len(ReturnField & vbNullString) > 0 Then .Bookmark = .LastModified InsertRecordValuesArrayReturnFieldValue = .Fields(ReturnField) Else InsertRecordValuesArrayReturnFieldValue = True End If - + .Close - + End With Set rst = Nothing ExitHere: Exit Function - + ResumeRaiseError: On Error GoTo 0 Err.Raise ErrNo, ErrSource, ErrDesc @@ -1170,14 +1145,14 @@ Private Function NewRecord_FieldArray(ByVal strSource As String, ByVal ReturnFie lngNum = UBound(DataParams) + 1 ReDim DataFields(lngNum \ 2) ReDim DataValues(lngNum \ 2) - + anz = 0 For i = 0 To (lngNum - 2) Step 2 DataFields(anz) = DataParams(i) DataValues(anz) = DataParams(i + 1) anz = anz + 1 Next i - + Set rst = Me.OpenRecordset(strSource, dbOpenDynaset) On Error GoTo HandleErr @@ -1261,32 +1236,32 @@ On Error GoTo HandleErr Dim fCopyVal() As Variant lngNum = UBound(DataToChange) + 1 - + anz = 0 ReDim strCtl((lngNum \ 2) - 1) ReDim valCtl((lngNum \ 2) - 1) - + For i = 0 To (lngNum - 2) Step 2 strCtl(anz) = DataToChange(i) valCtl(anz) = DataToChange(i + 1) anz = anz + 1 Next i - - 'Recordsetobjekt öffnen + + 'Recordsetobjekt öffnen Set rst = OpenRecordset(Source, dbOpenDynaset) - + If rst.EOF And rst.BOF Then rst.Close Set rst = Nothing CopyRecord_FieldArray = 0 Exit Function End If - + With rst .MoveLast .MoveFirst dsAnz = .RecordCount - + If LastFieldNumber = 0 Then lngLastCopyField = .Fields.Count ElseIf LastFieldNumber < 0 Then @@ -1294,11 +1269,11 @@ On Error GoTo HandleErr Else lngLastCopyField = LastFieldNumber End If - + ReDim fCopyVal(dsAnz, lngLastCopyField) - + If StartFieldNumber > 1 Then Start = StartFieldNumber - 1 Else Start = 0 - + 'Werte einlesen iDS = 0 While Not .EOF @@ -1309,7 +1284,7 @@ On Error GoTo HandleErr iDS = iDS + 1 Wend .MoveLast - + 'Werte kopieren For iDS = 0 To (dsAnz - 1) .AddNew @@ -1321,18 +1296,18 @@ On Error GoTo HandleErr Next i .Update Next iDS - + If Len(ReturnFieldName) > 0 Then .Bookmark = .LastModified CopyRecord_FieldArray = .Fields(ReturnFieldName).Value Else CopyRecord_FieldArray = True End If - + .Close - + End With - + ExitHere: Exit Function @@ -1350,14 +1325,14 @@ On Error Resume Next End If On Error GoTo 0 Err.Raise FncErrNr, "DaoHandler.CopyRecord_FieldArray", FncErrDesc - + End Function '--------------------------------------------------------------------------------------- ' Function: CopyRecords '--------------------------------------------------------------------------------------- ' -' Recordset öffnen und Werte eines Datensatzes anfügen +' Recordset öffnen und Werte eines Datensatzes anfügen ' ' Parameters: ' Source - Data source (table name or SQL statement) @@ -1375,20 +1350,20 @@ End Function Public Function CopyRecords(ByVal Source As String, _ ByVal StartFieldNumber As Long, ByVal LastFieldNumber As Long, _ ParamArray DataToChange() As Variant) As Boolean - + Dim maxIdx As Long Dim vA() As Variant Dim i As Long maxIdx = UBound(DataToChange) ReDim vA(maxIdx) - + For i = 0 To maxIdx vA(i) = DataToChange(i) Next i CopyRecords = CopyRecordsArrayReturnFieldValue(Source, StartFieldNumber, LastFieldNumber, vbNullString, vA) - + End Function '--------------------------------------------------------------------------------------- @@ -1396,7 +1371,7 @@ End Function '--------------------------------------------------------------------------------------- '/** ' -' Datensätze kopieren und Werte ändern +' Datensätze kopieren und Werte ändern ' ' Parameters: ' Source - Data source (table name or SQL statement) @@ -1416,7 +1391,7 @@ Public Function CopyRecordsReturnFieldValue(ByVal Source As String, _ ByVal StartFieldNumber As Long, ByVal LastFieldNumber As Long, _ ByVal ReturnFieldName As String, _ ParamArray DataToChange() As Variant) As Variant - + Dim maxIdx As Long Dim vA() As Variant Dim i As Long @@ -1442,33 +1417,33 @@ On Error GoTo HandleErr Dim lngLastCopyField As Long, dsAnz As Long, Start As Long Dim CopyFieldsAndValues() As Variant Dim ErrNo As Long, ErrDesc As String, ErrSource As String - + lngNum = UBound(UpdateFieldsAndValues) - LBound(UpdateFieldsAndValues) + 1 - + anz = 0 ReDim strCtl((lngNum \ 2) - 1) ReDim valCtl((lngNum \ 2) - 1) - + For i = 0 To (lngNum - 2) Step 2 strCtl(anz) = UpdateFieldsAndValues(i) valCtl(anz) = UpdateFieldsAndValues(i + 1) anz = anz + 1 Next i - + Set rst = Me.OpenRecordset(SqlSource, dbOpenDynaset) - + If rst.EOF And rst.BOF Then rst.Close Set rst = Nothing CopyRecordsArrayReturnFieldValue = 0 Exit Function End If - + With rst .MoveLast .MoveFirst dsAnz = .RecordCount - + If LastFeldID = 0 Then lngLastCopyField = .Fields.Count ElseIf LastFeldID < 0 Then @@ -1476,11 +1451,11 @@ On Error GoTo HandleErr Else lngLastCopyField = LastFeldID End If - + ReDim CopyFieldsAndValues(dsAnz, lngLastCopyField) - + If StartFeldID > 1 Then Start = StartFeldID - 1 Else Start = 0 - + 'Read values iDS = 0 While Not .EOF @@ -1493,7 +1468,7 @@ On Error GoTo HandleErr iDS = iDS + 1 Wend .MoveLast - + 'Copy values For iDS = 0 To (dsAnz - 1) .AddNew @@ -1507,7 +1482,7 @@ On Error GoTo HandleErr Next i .Update Next iDS - + If Len(ReturnField & vbNullString) > 0 Then .Bookmark = .LastModified CopyRecordsArrayReturnFieldValue = .Fields(ReturnField) @@ -1516,11 +1491,11 @@ On Error GoTo HandleErr End If .Close End With - + ExitHere: Set rst = Nothing Exit Function - + ResumeRaiseError: On Error GoTo 0 Err.Raise ErrNo, ErrSource, ErrDesc diff --git a/source/codelib/data/DbConnectionHandler.cls b/source/modules/DbConnectionHandler.cls similarity index 99% rename from source/codelib/data/DbConnectionHandler.cls rename to source/modules/DbConnectionHandler.cls index 9974002..b4c6821 100644 --- a/source/codelib/data/DbConnectionHandler.cls +++ b/source/modules/DbConnectionHandler.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -34,7 +34,7 @@ Attribute VB_Exposed = False Option Compare Text Option Explicit -'Objekte für Datenzugriff +'Objekte für Datenzugriff Private WithEvents m_DaoHandler As DaoHandler Attribute m_DaoHandler.VB_VarHelpID = -1 Private WithEvents m_AdodbHandler As AdodbHandler @@ -154,10 +154,10 @@ Public Sub Dispose() On Error Resume Next ClearObjectReferences - + m_Disposed = True RaiseEvent Disposed - + End Sub Private Sub ClearObjectReferences() @@ -168,17 +168,17 @@ On Error Resume Next m_AdodbHandler.Dispose Set m_AdodbHandler = Nothing End If - + If Not m_DaoHandler Is Nothing Then m_DaoHandler.Dispose Set m_DaoHandler = Nothing End If - + If Not m_OdbcHandler Is Nothing Then m_OdbcHandler.Dispose Set m_OdbcHandler = Nothing End If - + End Sub @@ -374,7 +374,7 @@ Private Sub m_OdbcHandler_ErrorMissingCurrentDb(ByVal Msg As String, ByRef NewCu '1. Try to pass from DAO class: Set NewCurrentDbRef = Me.DAO.CurrentDb - + '2. Trigger event if Me.DAO.CurrentDb also returns nothing If NewCurrentDbRef Is Nothing Then RaiseEvent ErrorMissingCurrentDb(Msg, NewCurrentDbRef) @@ -382,5 +382,5 @@ Private Sub m_OdbcHandler_ErrorMissingCurrentDb(ByVal Msg As String, ByRef NewCu Set Me.DAO.CurrentDb = NewCurrentDbRef End If End If - + End Sub diff --git a/source/codelib/data/DbConnectionInfo.cls b/source/modules/DbConnectionInfo.cls similarity index 98% rename from source/codelib/data/DbConnectionInfo.cls rename to source/modules/DbConnectionInfo.cls index 599ca3b..71c1bb2 100644 --- a/source/codelib/data/DbConnectionInfo.cls +++ b/source/modules/DbConnectionInfo.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -67,7 +67,7 @@ Private Const m_DBMSNAME_MSSQL As String = "MSSQL" Private Const m_DBMSNAME_MYSQL As String = "MySQL" Private Const m_DBMSNAME_ORACLE As String = "ORACLE" Private Const m_DBMSNAME_ODBC As String = "ODBC" - + 'DBMS Provider/Driver Private m_DBODBCDRIVER As String Private m_DBOLEDBPROVIDER As String @@ -96,7 +96,7 @@ Private m_DBOPTIONS_OLEDB As String 'Connection string Private m_OledbConnectionString As String Private m_OdbcConnectionString As String -Private m_DatabaseFile As String 'für dateibasierte DBS +Private m_DatabaseFile As String 'für dateibasierte DBS 'Login form Private m_UseLoginForm As Boolean @@ -209,7 +209,7 @@ Private Declare PtrSafe Function WritePrivateProfileString Lib "kernel32" _ ByVal lpKeyName As Any, _ ByVal lpString As Any, _ ByVal lpFileName As String) As Long - + Private Sub Class_Terminate() On Error Resume Next Dispose @@ -224,12 +224,12 @@ On Error Resume Next RaiseEvent Disposed End Sub - + '################################################### ' ' Group: DBMS Connection Parameters ' - + '--------------------------------------------------------------------------------------- 'Property: ConnectionIdentifier '--------------------------------------------------------------------------------------- @@ -244,16 +244,16 @@ End Property Public Property Let ConnectionIdentifier(ByVal ConnectionIdentifierToUse As String) On Error Resume Next - + ClearConnectionInfo m_ConnectionIdentifier = ConnectionIdentifierToUse - + If Len(m_ConnectionIdentifier) > 0 Then LoadConnectionData RaiseDbmsConnectionChangedEvent:=True Else RaiseEvent DbmsConnectionChanged(vbNullString) End If - + End Property Public Property Get CID() As String @@ -371,15 +371,15 @@ Private Sub m_LoginForm_Cancelled() End Sub Private Sub m_LoginForm_Logon(ByVal LoginName As String, ByVal Password As String, Cancel As Boolean) - + Dim ErrMsg As String m_LoginCancelled = False m_DBUSER = LoginName m_DBUSERPWD = Password - + Call SetConnectionStrings(False) - + If CheckAdoConnection(m_OledbConnectionString, ErrMsg) = False Then If Len(ErrMsg) > 0 Then ErrMsg = vbNewLine & vbNewLine & ErrMsg MsgBox "Verbindung konnte nicht hergestellt werden" & ErrMsg @@ -412,18 +412,18 @@ Private Sub SetConnectionStrings(Optional ByVal bWithConnectionCheck As Boolean ElseIf m_LoginCancelled Then Exit Sub End If - + If m_CONNECTIONMODE = DbmsConnectionModes.DBMS_USERDEF Then 'user-defined string => no determination via dbms class required Exit Sub End If - + myConnectionStrings = Me.ConnectionStrings m_OledbConnectionString = myConnectionStrings.OledbConnectionString m_OdbcConnectionString = myConnectionStrings.OdbcConnectionString m_DatabaseFile = myConnectionStrings.DatabaseFile - + If bWithConnectionCheck Then If CheckConnection(ErrMsg) = False Then If Len(ErrMsg) > 0 Then ErrMsg = vbNewLine & vbNewLine & ErrMsg @@ -451,7 +451,7 @@ Public Property Get DbUser(Optional ByVal WithoutServerCheck As Boolean = False) SetConnectionStrings End If End If - + If m_TRUSTEDCONNECTION Then DbUser = GetDbUserName Else @@ -476,13 +476,13 @@ Private Property Get DbUserPassword() As String SetConnectionStrings End If DbUserPassword = m_DBUSERPWD - + End Property Friend Property Let DbUserPassword(ByVal NewValue As String) m_DBUSERPWD = NewValue - + End Property '--------------------------------------------------------------------------------------- @@ -559,7 +559,7 @@ Friend Property Get OledbConnectionString() As String SetConnectionStrings End If OledbConnectionString = m_OledbConnectionString - + End Property '--------------------------------------------------------------------------------------- @@ -611,7 +611,7 @@ End Property ' '--------------------------------------------------------------------------------------- Public Function CheckConnection(Optional ByRef ErrMsg As String = vbNullString) As Boolean - + Dim checkOk As Boolean checkOk = CheckAdoConnection(OledbConnectionString, ErrMsg) @@ -620,7 +620,7 @@ Public Function CheckConnection(Optional ByRef ErrMsg As String = vbNullString) checkOk = checkOk And CheckOdbcConnection(OdbcConnectionString, ErrMsg) End If End If - + CheckConnection = checkOk End Function @@ -634,12 +634,12 @@ Private Function CheckAdoConnection(ByVal sOleDbConnectionstring As String, ByRe CheckAdoConnection = False Exit Function End If - + Set cnn = CreateObject("ADODB.Connection") With cnn .ConnectionString = sOleDbConnectionstring .ConnectionTimeout = m_CheckConnectionTimeoutSeconds - + On Error Resume Next .Open If Err.Number <> 0 Then @@ -652,7 +652,7 @@ On Error Resume Next CheckAdoConnection = False Exit Function End If - + If .State = adStateOpen Then .Close CheckAdoConnection = True @@ -674,7 +674,7 @@ Private Function CheckOdbcConnection(ByVal sOdbcConnectionstring As String, ByRe CheckOdbcConnection = False Exit Function End If - + On Error Resume Next Set db = DBEngine.OpenDatabase("", dbDriverComplete, True, sOdbcConnectionstring) @@ -690,7 +690,7 @@ On Error Resume Next db.Close End If Set db = Nothing - + CheckOdbcConnection = checkOk End Function @@ -712,7 +712,7 @@ Public Sub ClearConnectionInfo() On Error Resume Next bolRaiseEvent = (Len(m_DBMSNAME & m_OledbConnectionString & m_OdbcConnectionString) > 0) - + m_DBMSNAME = vbNullString m_OledbConnectionString = vbNullString m_OdbcConnectionString = vbNullString @@ -730,18 +730,18 @@ On Error Resume Next m_UseLoginForm = False m_LoginCancelled = False m_DbmsInfoReaded = False - + If bolRaiseEvent Then RaiseEvent DbmsConnectionInfoCleared End If - + End Sub '--------------------------------------------------------------------------------------- ' Function: ChangeDbUserPassword '--------------------------------------------------------------------------------------- ' -' Datenbankpasswort des Benutzers ändern +' Datenbankpasswort des Benutzers ändern ' ' Parameters: ' NewPassword - New passwort @@ -758,7 +758,7 @@ Public Function ChangeDbUserPassword( _ ByVal OldPassword As String, _ Optional ByVal LoginName As String = vbNullString, _ Optional ByRef Msg As String) As Boolean - + Dim bolPwdChanged As Boolean Dim strSQL As String Dim strLoginName As String @@ -766,7 +766,7 @@ Public Function ChangeDbUserPassword( _ Set cnn = New ADODB.Connection cnn.Open OledbConnectionString - + If Len(LoginName) > 0 Then strLoginName = LoginName Else @@ -774,11 +774,11 @@ Public Function ChangeDbUserPassword( _ End If strSQL = "ALTER LOGIN " & strLoginName & " WITH PASSWORD = '" & NewPassword & "'" - + If Len(OldPassword) > 0 Then strSQL = strSQL & " OLD_PASSWORD = '" & OldPassword & "'" End If - + On Error Resume Next With cnn .Errors.Clear @@ -793,17 +793,17 @@ Public Function ChangeDbUserPassword( _ .Close End With Set cnn = Nothing - + If bolPwdChanged Then - + If strLoginName = m_DBUSER Then m_DBUSERPWD = NewPassword SetConnectionStrings RaiseEvent PasswordChanged End If - + End If - + ChangeDbUserPassword = bolPwdChanged End Function @@ -848,9 +848,9 @@ Private Function GetDbUserName() As String On Error GoTo 0 Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.DbUserName", "For '" & m_DBMSNAME & "' the UserName cannot be determined. (Selection not possible.)" End Select - + Set rst = cnn.Execute(strSQL) - + GetDbUserName = Nz(rst.Fields(0), "N/A") rst.Close cnn.Close @@ -859,7 +859,7 @@ End Function Private Function GetOdbcUserInfo(Optional ByVal sUID As String = vbNullString, _ Optional ByVal sPWD As String = vbNullString) As String - + If Len(sUID) = 0 Then If m_DbmsInfoReaded = False Then LoadConnectionData @@ -867,7 +867,7 @@ Private Function GetOdbcUserInfo(Optional ByVal sUID As String = vbNullString, _ sUID = m_DBUSER sPWD = m_DBUSERPWD End If - + Select Case m_DBMSNAME Case m_DBMSNAME_MSSQL GetOdbcUserInfo = getOdbcUserInfo_MSSQL(sUID, sPWD) @@ -904,11 +904,11 @@ Private Function ConnectionStrings_MSJET() As DbmsConnectionStrings strOLEDB = "Provider=" & m_DBOLEDBPROVIDER & ";Data Source=" & strDbFile & ";Mode=Share Deny None;" & strOLEDB strODBC = ";DATABASE=" & strDbFile & strODBC - + tempConnectionStrings.OledbConnectionString = strOLEDB tempConnectionStrings.OdbcConnectionString = strODBC tempConnectionStrings.DatabaseFile = strDbFile - + ConnectionStrings_MSJET = tempConnectionStrings End Function @@ -923,7 +923,7 @@ Private Function ConnectionStrings_MSSQL() As DbmsConnectionStrings If Len(m_PORT) > 0 Then strSrvCon = strSrvCon & "," & m_PORT End If - + If m_TRUSTEDCONNECTION Then strODBC = ";Trusted_Connection=Yes" strOLEDB = ";Integrated Security = SSPI" @@ -954,17 +954,17 @@ Private Function ConnectionStrings_MSSQL() As DbmsConnectionStrings End If strODBC = "DRIVER={" & m_DBODBCDRIVER & "};DATABASE=" & m_DBNAME & ";SERVER=" & strSrvCon & strODBC End If - + tempConnectionStrings.OledbConnectionString = strOLEDB tempConnectionStrings.OdbcConnectionString = "ODBC;" & strODBC - + ConnectionStrings_MSSQL = tempConnectionStrings End Function Private Function GetDataProviderOledbString(ByVal BaseOledbString As String) As String 'Provider=Microsoft.Access.OLEDB.10.0;Data Provider=SQLOLEDB - + GetDataProviderOledbString = Replace(BaseOledbString, "Provider=", "Provider=Microsoft.Access.OLEDB.10.0;Data Provider=") End Function @@ -1000,7 +1000,7 @@ Private Function ConnectionStrings_MySQL() As DbmsConnectionStrings If Len(m_DBOPTIONS_ODBC) > 0 Then strODBC = strODBC & m_DBOPTIONS_ODBC & ";" End If - + If Len(m_DSN) > 0 Then strODBC = "DSN=" & m_DSN & ";" & strODBC Else @@ -1009,7 +1009,7 @@ Private Function ConnectionStrings_MySQL() As DbmsConnectionStrings End If strODBC = "DRIVER={" & m_DBODBCDRIVER & "};DATABASE=" & m_DBNAME & ";SERVER=" & strSrvCon & ";" & strODBC End If - + tempConnectionStrings.OdbcConnectionString = "ODBC;" & strODBC tempConnectionStrings.OledbConnectionString = "Provider=MSDASQL;" & strODBC @@ -1035,17 +1035,17 @@ Private Function ConnectionStrings_ORACLE() As DbmsConnectionStrings strODBC = getOdbcUserInfo_ORACLE(m_DBUSER, m_DBUSERPWD) & ";" strOLEDB = "User ID=" & m_DBUSER & ";Password=" & m_DBUSERPWD & ";" End If - + If Len(m_DBOPTIONS_OLEDB) > 0 Then strOLEDB = strOLEDB & m_DBOPTIONS_OLEDB & ";" End If If Len(m_DBOPTIONS_ODBC) > 0 Then strODBC = strODBC & m_DBOPTIONS_ODBC & ";" End If - + 'Microsoft ODBC for Oracle: strSrvCon = "(DESCRIPTION=(ADDRESS=(COMMUNITY=)(PROTOCOL=TCP)(Host=" & m_DBSERVER & ")(Port=" & m_PORT & "))(CONNECT_DATA=(SID=" & m_DBNAME & ")))" - + If Len(m_DBOLEDBPROVIDER) = 0 Then m_DBOLEDBPROVIDER = "OraOLEDB.Oracle" End If @@ -1059,10 +1059,10 @@ Private Function ConnectionStrings_ORACLE() As DbmsConnectionStrings End If strODBC = "DRIVER={" & m_DBODBCDRIVER & "};SERVER=" & strSrvCon & ";" & strODBC End If - + tempConnectionStrings.OledbConnectionString = strOLEDB tempConnectionStrings.OdbcConnectionString = "ODBC;" & strODBC - + ConnectionStrings_ORACLE = tempConnectionStrings End Function @@ -1077,7 +1077,7 @@ Private Function ConnectionStrings_ODBC() As DbmsConnectionStrings Dim tempConnectionStrings As DbmsConnectionStrings Dim strODBC As String Dim strSrvCon As String - + If Len(m_DBODBCDRIVER) = 0 Then Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NOCONFIG, "ConnectionStrings_ODBC", "No ODBC driver was specified" End If @@ -1096,16 +1096,16 @@ Private Function ConnectionStrings_ODBC() As DbmsConnectionStrings If Len(m_DBOPTIONS_ODBC) > 0 Then strODBC = strODBC & m_DBOPTIONS_ODBC & ";" End If - + If Len(m_DSN) > 0 Then strODBC = "DSN=" & m_DSN & ";" & strODBC Else strODBC = "DRIVER={" & m_DBODBCDRIVER & "};DATABASE=" & m_DBNAME & ";SERVER=" & strSrvCon & ";" & strODBC End If - + tempConnectionStrings.OdbcConnectionString = "ODBC;" & strODBC tempConnectionStrings.OledbConnectionString = "Provider=MSDASQL;" & strODBC - + ConnectionStrings_ODBC = tempConnectionStrings End Function @@ -1124,7 +1124,7 @@ End Function ' '--------------------------------------------------------------------------------------- Public Property Get TableListSqlText() As String - + Select Case m_DBMSNAME Case m_DBMSNAME_MSSQL TableListSqlText = "select T.TABLE_NAME, T.TABLE_SCHEMA, cast(T.TABLE_SCHEMA + '.' + T.TABLE_NAME as varchar(255)) AS TabKey from information_schema.TABLES T Order By T.TABLE_NAME, T.TABLE_SCHEMA" @@ -1139,24 +1139,24 @@ Public Property Get TableListSqlText() As String Case vbNullString TableListSqlText = vbNullString Case Else - Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.TableListSQL", "Für '" & m_DBMSNAME & "' können keine Connectionstrings erzeugt werden. (Auswahl nicht möglich.)" + Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.TableListSQL", "Für '" & m_DBMSNAME & "' können keine Connectionstrings erzeugt werden. (Auswahl nicht möglich.)" End Select End Property Private Function SetLoginData() As Boolean - + Dim cnn As ADODB.Connection Dim cmd As ADODB.Command Dim rst As ADODB.Recordset - + Dim strWindowUser As String strWindowUser = Environ("username") - + Set cnn = New ADODB.Connection cnn.Open ConnectionStrings_MySQL.OledbConnectionString - + Set cmd = New ADODB.Command Set cmd.ActiveConnection = cnn cmd.CommandText = "GetLoginData" @@ -1173,7 +1173,7 @@ Private Function SetLoginData() As Boolean m_DBUSERPWD = rst.Fields(1) SetLoginData = True End If - + rst.Close Set cmd = Nothing cnn.Close @@ -1234,7 +1234,7 @@ Public Property Get DateFormat() As String Case m_DBMSNAME_ODBC DateFormat = "'yyyymmdd hh:nn:ss'" Case Else - Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.DateFormat", "Für '" & m_DBMSNAME & "' kann keine Datumsfromat ermittelt werden." + Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.DateFormat", "Für '" & m_DBMSNAME & "' kann keine Datumsfromat ermittelt werden." End Select End Property @@ -1282,7 +1282,7 @@ Public Property Get BooleanTrueString() As String Case m_DBMSNAME_ODBC BooleanTrueString = "True" Case Else - Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.BooleanTrueString", "Für '" & m_DBMSNAME & "' kann kein True-String ermittelt werden." + Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.BooleanTrueString", "Für '" & m_DBMSNAME & "' kann kein True-String ermittelt werden." End Select End Property @@ -1328,18 +1328,18 @@ End Property Private Sub LoadConnectionData(Optional ByVal WithoutLoginForm As Boolean = False, Optional ByVal RaiseDbmsConnectionChangedEvent As Boolean = False) - + Dim tempConnID As String tempConnID = m_ConnectionIdentifier ClearConnectionInfo - + LoadConnectionDataFromTable - + m_DbmsInfoReaded = True m_SAVEPWD = (Len(m_DBUSERPWD) > 0) And (m_UseLoginForm = False) - + If m_DBMSNAME = "MSJET" Then m_DatabaseFile = m_DBNAME End If @@ -1352,7 +1352,7 @@ Private Sub LoadConnectionData(Optional ByVal WithoutLoginForm As Boolean = Fals If Len(LoginUserName) = 0 Then LoginUserName = m_DBUSER End If - + 'Make m_LoginForm accessible via Property LoginForm and set it in the LoginForm itself: DoCmd.OpenForm LoginFormName, acNormal, , , acFormEdit, acDialog, ObjPtr(Me) & "@" & m_ConnectionIdentifier & "@" & LoginUserName #Else @@ -1360,7 +1360,7 @@ Private Sub LoadConnectionData(Optional ByVal WithoutLoginForm As Boolean = Fals #End If End If End If - + If (tempConnID <> m_ConnectionIdentifier) Or RaiseDbmsConnectionChangedEvent Then RaiseEvent DbmsConnectionChanged(m_ConnectionIdentifier) End If @@ -1372,7 +1372,7 @@ Private Sub LoadConnectionDataFromTable() Dim rst As DAO.Recordset Dim SelectSql As String Dim Loa - + If Len(m_ConnectionIdentifier) = 0 Then 'Select the DS that has been marked as "Active". SelectSql = ActivatedConnDataSelectSql Else @@ -1381,10 +1381,10 @@ Private Sub LoadConnectionDataFromTable() Set rst = CurrentDb.OpenRecordset(SelectSql, dbOpenSnapshot) If rst.EOF Then - + rst.Close Set rst = Nothing - + If Len(m_ConnectionIdentifier) = 0 Then 'no connection has been activated yet If Not TryGetConnectionDataWithConfigForm(rst) Then Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.LoadDbmsConnectionDataFromTable", "Es wurde keine Verbindung aktiviert." @@ -1393,12 +1393,12 @@ Private Sub LoadConnectionDataFromTable() Exit Sub End If Else - Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.LoadDbmsConnectionDataFromTable", "Kein Eintrag für '" & m_ConnectionIdentifier & "' gefunden" + Err.Raise DbConnectionInfoErrorNumbers.ERRNR_NODBMS, "DbConnectionInfo.LoadDbmsConnectionDataFromTable", "Kein Eintrag für '" & m_ConnectionIdentifier & "' gefunden" Exit Sub End If - + End If - + 'Read settings LoadConnectionDataFromRecordset rst rst.Close @@ -1409,20 +1409,20 @@ End Sub Private Function TryGetConnectionDataWithConfigForm(ByRef rst As DAO.Recordset) As Boolean If Len(DbmsConfigFormName) > 0 Then - + If MsgBox("No connection has been activated yet." & vbNewLine & _ "Please check the connection parameters and activate the desired connection.", _ vbInformation + vbOKCancel) = vbOK Then - + DoCmd.OpenForm DbmsConfigFormName, , , , , acDialog 'Abort, if already initialized via form If m_DbmsInfoReaded Then TryGetConnectionDataWithConfigForm = True Exit Function End If - + End If - + Set rst = CurrentDb.OpenRecordset(ActivatedConnDataSelectSql, dbOpenSnapshot) If Not rst.EOF Then m_ConnectionIdentifier = Nz(rst.Fields("CID"), vbNullString) @@ -1432,9 +1432,9 @@ Private Function TryGetConnectionDataWithConfigForm(ByRef rst As DAO.Recordset) Set rst = Nothing TryGetConnectionDataWithConfigForm = False End If - + End If - + End Function Private Sub LoadConnectionDataFromRecordset(ByVal rst As DAO.Recordset) @@ -1447,22 +1447,22 @@ Private Sub LoadConnectionDataFromRecordset(ByVal rst As DAO.Recordset) Exit Sub End If End If - + m_DBMSNAME = Nz(rst.Fields("DBMS"), vbNullString) m_CONNECTIONMODE = Nz(.Fields("dbmsConnectionMode"), 0) '1 = DNS less, 2 = DSN, 4 = custom - + m_DBNAME = .Fields("dbmsDatabase") & vbNullString - + m_DBSERVER = .Fields("dbmsServer") & vbNullString m_PORT = .Fields("dbmsPort") & vbNullString - + m_TRUSTEDCONNECTION = Nz(.Fields("dbmsUseTrustedConnection"), False) m_UseLoginForm = Nz(.Fields("dbmsUseLoginForm"), False) m_DBUSER = .Fields("dbmsUser") & vbNullString m_DBUSERPWD = .Fields("dbmsPwd") & vbNullString - + If Not m_TRUSTEDCONNECTION Then - + 'Try get login data by Event (to get password from vba code) If Len(m_DBUSER) = 0 Or Len(m_DBUSERPWD) = 0 Then RaiseEvent LoginDataRequired(m_DBUSER, m_DBUSERPWD) @@ -1472,34 +1472,34 @@ Private Sub LoadConnectionDataFromRecordset(ByVal rst As DAO.Recordset) End If End If End If - + 'Falls kein Name angegeben ist, Loginform aktivieren If Not (m_UseLoginForm Or m_TRUSTEDCONNECTION) And Len(m_DBUSER) = 0 Then m_UseLoginForm = (m_DBMSNAME <> "MSJET") End If - + End If - + m_DSN = .Fields("dbmsDSN") & vbNullString - + m_DBOLEDBPROVIDER = .Fields("dbmsOleDbProvider") & vbNullString m_DBOPTIONS_OLEDB = .Fields("dbmsOptionsOLEDB") & vbNullString - + m_DBODBCDRIVER = .Fields("dbmsOdbcDriver") & vbNullString m_DBOPTIONS_ODBC = .Fields("dbmsOptionsODBC") & vbNullString - + m_OledbConnectionString = .Fields("dbmsConStrOLEDB") & vbNullString m_OdbcConnectionString = .Fields("dbmsConStrODBC") & vbNullString End With - + End Sub Private Function GetUserNameFromConfigFile() As String Dim ReturnStr As String * 1280 Dim RetVal As Long - + On Error Resume Next RetVal = GetPrivateProfileString("Login", "UserName", vbNullString & vbNullChar, ReturnStr, Len(ReturnStr), CurrentProject.Path & "\" & m_ConnectionIdentifier & ".ini") diff --git a/source/codelib/data/DbConnectionManager.cls b/source/modules/DbConnectionManager.cls similarity index 96% rename from source/codelib/data/DbConnectionManager.cls rename to source/modules/DbConnectionManager.cls index 7de7b58..57319cc 100644 --- a/source/codelib/data/DbConnectionManager.cls +++ b/source/modules/DbConnectionManager.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -69,11 +69,11 @@ End Sub Public Sub Dispose() On Error Resume Next - + If m_Disposed Then Exit Sub DisposePermanentBackendRst - + Set m_DbConnection = Nothing Set m_DbConnectionInfo = Nothing @@ -151,7 +151,7 @@ Public Property Get ConnectionInfo() As DbConnectionInfo m_Disposed = False End If Set ConnectionInfo = m_DbConnectionInfo - + End Property '--------------------------------------------------------------------------------------- @@ -173,19 +173,19 @@ Public Property Get DbConnection() As DbConnectionHandler InitDbConnection End If Set DbConnection = m_DbConnection - + End Property Private Sub InitDbConnection() - + Dim OdbcConnectionString As String Dim OledbConnectionString As String Dim NewSettings As DbConnectionSettings - + If m_DbConnection Is Nothing Then Set m_DbConnection = New DbConnectionHandler End If - + Set NewSettings = DefaultSettings.Clone With Me.ConnectionInfo OdbcConnectionString = .OdbcConnectionString @@ -194,29 +194,29 @@ Private Sub InitDbConnection() NewSettings.SqlWildCardString = .WildCardString NewSettings.SqlBooleanTrueString = .BooleanTrueString End With - + RaiseEvent BeforeInitDbConnection(OdbcConnectionString, OledbConnectionString, NewSettings) - - ' DefaultSettings von NewSettings übernehmen: + + ' DefaultSettings von NewSettings übernehmen: ' Kopieren und nicht Referenz zuweisen, damit Daten passen, falls an anderer Stelle bereits eine Referenz auf DefaultSettings gesetzt wurde DefaultSettings.CopyFrom NewSettings - - Set m_DbConnection.CurrentDb = Application.CurrentDb ' ... nicht unbedingt erforderlich, wird bei Bedarf über Event angefordert + + Set m_DbConnection.CurrentDb = Application.CurrentDb ' ... nicht unbedingt erforderlich, wird bei Bedarf über Event angefordert m_DbConnection.OdbcConnectionString = OdbcConnectionString m_DbConnection.OledbConnectionString = OledbConnectionString - + With DefaultSettings SqlTools.SqlDateFormat = .SqlDateFormat SqlTools.SqlWildCardString = .SqlWildCardString SqlTools.SqlBooleanTrueString = .SqlBooleanTrueString - + m_DbConnection.ADODB.DefaultCursorLocation = .DefaultAdodbCursorLocation - + If .OpenPermanentBackendRecordset Then OpenPermanentBackendRecordset End If - + End With RaiseEvent DbConnectionInitialized @@ -231,15 +231,15 @@ Private Sub OpenPermanentBackendRecordset() On Error GoTo 0 Set m_PermanentBackendRst = Nothing End If - + If Len(ConnectionInfo.DbmsName) = 0 Then Exit Sub End If - + If Len(Me.ConnectionInfo.OdbcConnectionString) > 0 Then Set m_PermanentBackendRst = Me.DbConnection.ODBC.OpenRecordsetPT(Me.ConnectionInfo.PermanentBackendRstSqlText, dbOpenSnapshot) End If - + End Sub @@ -251,20 +251,20 @@ End Sub ' Private Sub m_DbConnectionInfo_DbmsConnectionChanged(ByVal newCID As String) 'DbConnection neu initialisieren lassen - + On Error Resume Next - 'ADO-Verbindung schließen + 'ADO-Verbindung schließen Me.DbConnection.ADODB.Dispose - - 'ODBC-Verbindung schließen + + 'ODBC-Verbindung schließen Me.DbConnection.ODBC.Dispose - - 'Verbindung zum BE öffnen + + 'Verbindung zum BE öffnen If DefaultSettings.OpenPermanentBackendRecordset Then OpenPermanentBackendRecordset End If - + End Sub Private Sub m_DbConnectionInfo_DbmsConnectionInfoCleared() @@ -273,12 +273,12 @@ Private Sub m_DbConnectionInfo_DbmsConnectionInfoCleared() On Error Resume Next - 'ADO-Verbindung schließen + 'ADO-Verbindung schließen Me.DbConnection.ADODB.Dispose - - 'ODBC-Verbindung schließen + + 'ODBC-Verbindung schließen Me.DbConnection.ODBC.Dispose - + End Sub Private Sub m_DbConnectionInfo_Disposed() diff --git a/source/codelib/data/DbConnectionSettings.cls b/source/modules/DbConnectionSettings.cls similarity index 98% rename from source/codelib/data/DbConnectionSettings.cls rename to source/modules/DbConnectionSettings.cls index 398622c..56db37d 100644 --- a/source/codelib/data/DbConnectionSettings.cls +++ b/source/modules/DbConnectionSettings.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -103,15 +103,15 @@ End Function Public Sub CopyFrom(ByVal NewSettings As DbConnectionSettings) With NewSettings - + SqlDateFormat = .SqlDateFormat SqlWildCardString = .SqlWildCardString SqlBooleanTrueString = .SqlBooleanTrueString - + DefaultAdodbCursorLocation = .DefaultAdodbCursorLocation - + OpenPermanentBackendRecordset = .OpenPermanentBackendRecordset - + End With - + End Sub diff --git a/source/codelib/vba/ErrorTrappingObserver.cls b/source/modules/ErrorTrappingObserver.cls similarity index 99% rename from source/codelib/vba/ErrorTrappingObserver.cls rename to source/modules/ErrorTrappingObserver.cls index c95f5f8..560f245 100644 --- a/source/codelib/vba/ErrorTrappingObserver.cls +++ b/source/modules/ErrorTrappingObserver.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END diff --git a/source/codelib/file/FileTools.bas b/source/modules/FileTools.bas similarity index 98% rename from source/codelib/file/FileTools.bas rename to source/modules/FileTools.bas index b12fcdd..9fd2547 100644 --- a/source/codelib/file/FileTools.bas +++ b/source/modules/FileTools.bas @@ -1,5 +1,5 @@ -Attribute VB_Name = "FileTools" -Attribute VB_Description = "Funktionen für Dateioperationen" +Attribute VB_Name = "FileTools" +Attribute VB_Description = "Funktionen für Dateioperationen" '--------------------------------------------------------------------------------------- ' Package: file.FileTools '--------------------------------------------------------------------------------------- @@ -24,14 +24,14 @@ Option Explicit Option Private Module #If USELOCALIZATION_DE = 1 Then -Private Const SELECTBOX_FILE_DIALOG_TITLE As String = "Datei auswählen" -Private Const SELECTBOX_FOLDER_DIALOG_TITLE As String = "Ordner auswählen" -Private Const SELECTBOX_OPENTITLE As String = "auswählen" +Private Const SELECTBOX_FILE_DIALOG_TITLE As String = "Datei auswählen" +Private Const SELECTBOX_FOLDER_DIALOG_TITLE As String = "Ordner auswählen" +Private Const SELECTBOX_OPENTITLE As String = "auswählen" Private Const FILTERSTRING_ALL_FILES As String = "Alle Dateien (*.*)" #Else Private Const SELECTBOX_FILE_DIALOG_TITLE As String = "Select file" Private Const SELECTBOX_FOLDER_DIALOG_TITLE As String = "Select folder" -Private Const SELECTBOX_OPENTITLE As String = "auswählen" +Private Const SELECTBOX_OPENTITLE As String = "auswählen" Private Const FILTERSTRING_ALL_FILES As String = "All Files (*.*)" #End If @@ -57,7 +57,7 @@ Private Declare PtrSafe Function API_GetTempFilename Lib "kernel32" Alias "GetTe ByVal lpPrefixString As String, _ ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long - + Private Declare PtrSafe Function API_ShellExecuteA Lib "shell32.dll" ( _ ByVal Hwnd As LongPtr, _ ByVal lOperation As String, _ @@ -162,13 +162,13 @@ Private Function WizHook_GetFileName( _ ' 2: Eigenschaften ' 3: Liste ' 4: Miniaturansicht -' 5: Große Symbole +' 5: Große Symbole ' 6: Kleine Symbole 'flags 4: Set Current Dir -' 8: Mehrfachauswahl möglich +' 8: Mehrfachauswahl möglich ' 32: Ordnerauswahldialog -' 64: Wert im Parameter "View" berücksichtigen +' 64: Wert im Parameter "View" berücksichtigen Dim SelectedFileString As String Dim WizHookRetVal As Long @@ -214,25 +214,25 @@ End Function ' '--------------------------------------------------------------------------------------- Public Function UncPath(ByVal Path As String, Optional ByVal IgnoreErrors As Boolean = True) As String - + Dim UNC As String * 512 - + If VBA.Len(Path) = 1 Then Path = Path & ":" - + If WNetGetConnection(VBA.Left$(Path, 2), UNC, VBA.Len(UNC)) Then - + If IgnoreErrors Then UncPath = Path Else Err.Raise 5 ' Invalid procedure call or argument End If - + Else UncPath = VBA.Left$(UNC, VBA.InStr(UNC, vbNullChar) - 1) & VBA.Mid$(Path, 3) - + End If - + End Function '--------------------------------------------------------------------------------------- @@ -282,7 +282,7 @@ Public Function GetNewTempFileName(Optional ByVal PathToUse As String = "", _ Optional ByVal FileExtension As String = "") As String Dim NewTempFileName As String - + If Len(PathToUse) = 0 Then PathToUse = TempPath End If @@ -513,7 +513,7 @@ Public Function DirExists(ByVal FullPath As String) As Boolean DirExists = (VBA.Dir$(FullPath, vbDirectory Or vbReadOnly Or vbHidden Or vbSystem) = ".") VBA.Dir$ "\" ' Avoiding error: issue #109 - + End Function '--------------------------------------------------------------------------------------- @@ -664,7 +664,7 @@ Public Function GetRelativPathFromFullPath(ByVal FullPath As String, _ Optional ByVal DisableDecreaseBaseDir As Boolean = False) As String Dim RelativPath As String - + If FullPath = BaseDir Then GetRelativPathFromFullPath = "." Exit Function @@ -675,7 +675,7 @@ Public Function GetRelativPathFromFullPath(ByVal FullPath As String, _ GetRelativPathFromFullPath = "." Exit Function End If - + If Not DisableDecreaseBaseDir Then RelativPath = TryGetRelativPathWithDecreaseBaseDir(FullPath, BaseDir, EnableRelativePrefix) Else @@ -690,7 +690,7 @@ Public Function GetRelativPathFromFullPath(ByVal FullPath As String, _ End If End If End If - + GetRelativPathFromFullPath = RelativPath End Function @@ -701,7 +701,7 @@ Private Function TryGetRelativPathWithDecreaseBaseDir(ByVal FullPath As String, Dim DecreaseCounter As Long Dim Pos As Long Dim i As Long - + RelativPath = BaseDir Do While InStr(1, FullPath, RelativPath) = 0 @@ -713,7 +713,7 @@ Private Function TryGetRelativPathWithDecreaseBaseDir(ByVal FullPath As String, Exit Do End If Loop - + If Len(RelativPath) > 0 Then RelativPath = Replace(FullPath, RelativPath, vbNullString) For i = 1 To DecreaseCounter @@ -854,7 +854,7 @@ Public Function OpenFile(ByVal FilePath As String, Optional ByVal ReadOnlyMode A Dim FileNotFoundErrorText As String If Len(VBA.Dir(FilePath)) = 0 Then - + #If USELOCALIZATION = 1 Then FileNotFoundErrorText = Replace(L10n.Text(FileNotFoundErrorTextTemplate), "{FilePath}", FilePath) #Else @@ -865,7 +865,7 @@ Public Function OpenFile(ByVal FilePath As String, Optional ByVal ReadOnlyMode A End If OpenFile = ShellExecute(FilePath, "open") - + End Function '--------------------------------------------------------------------------------------- @@ -887,7 +887,7 @@ Public Function OpenFilePath(ByVal FolderPath As String) As Boolean Dim FolderNotFoundErrorText As String If Len(VBA.Dir(FolderPath, vbDirectory)) = 0 Then - + #If USELOCALIZATION = 1 Then FolderNotFoundErrorText = Replace(L10n.Text(FolderNotFoundErrorTextTemplate), "{FolderPath}", FolderPath) #Else @@ -898,7 +898,7 @@ Public Function OpenFilePath(ByVal FolderPath As String) As Boolean End If OpenFilePath = ShellExecute(FolderPath, "open") - + End Function Private Function ShellExecute(ByVal FilePath As String, _ @@ -917,7 +917,7 @@ Private Function ShellExecute(ByVal FilePath As String, _ DeskWin = Application.hWndAccessApp Ret = API_ShellExecuteA(DeskWin, ApiOperation, FilePath, vbNullString, vbNullString, vbNormalFocus) End If - + If Ret = SE_ERR_NOTFOUND Then #If USELOCALIZATION = 1 Then FileNotFoundErrorText = Replace(L10n.Text(FileNotFoundErrorTextTemplate), "{FilePath}", FilePath) @@ -930,16 +930,16 @@ Private Function ShellExecute(ByVal FilePath As String, _ ElseIf Ret = SE_ERR_NOASSOC Then ShellExecute = False Exit Function -' ToDo: "Öffnen mit"-Dialog verwenden: +' ToDo: "Öffnen mit"-Dialog verwenden: 'Wenn die Dateierweiterung noch nicht bekannt ist... - 'wird der "Öffnen mit..."-Dialog angezeigt. + 'wird der "Öffnen mit..."-Dialog angezeigt. ' Directory = Space$(260) ' Ret = GetSystemDirectory(Directory, Len(Directory)) ' Directory = Left$(Directory, Ret) ' Call ShellExecuteA(DeskWin, vbNullString, "RUNDLL32.EXE", "shell32.dll, OpenAs_RunDLL " & _ ' FilePath, Directory, vbNormalFocus) End If - + ShellExecute = True End Function diff --git a/source/codelib/localization/L10nDict.cls b/source/modules/L10nDict.cls similarity index 98% rename from source/codelib/localization/L10nDict.cls rename to source/modules/L10nDict.cls index 9858e10..d9eb7c6 100644 --- a/source/codelib/localization/L10nDict.cls +++ b/source/modules/L10nDict.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -77,11 +77,11 @@ Private Sub FillDict() Dim rst As DAO.Recordset Dim Key As DAO.Field Dim Msg As DAO.Field - + Set m_Dict = CreateObject("Scripting.Dictionary") - + On Error GoTo HandleErr - + Set rst = CodeDb.OpenRecordset("select KeyText, LngText from " & LngDictTableName & " where " & SqlTools.BuildCriteria("LangCode", SQL_Text, SQL_Equal, LangCode), dbOpenForwardOnly) With rst Set Key = .Fields("KeyText") @@ -94,11 +94,11 @@ On Error GoTo HandleErr rst.MoveNext Loop End With - + rst.Close - + RaiseEvent DictionaryRefreshed - + Exit Sub HandleErr: @@ -114,21 +114,21 @@ End Sub Friend Function CreateL10nDictTable() As Boolean Dim CreateTableDDL As String - + On Error GoTo HandleErr - + CreateTableDDL = "create table " & LngDictTableName & "(" & _ " LangCode varchar(2), KeyText varchar(255), LngText varchar(255)" & _ ", CONSTRAINT PK_" & LngDictTableName & " PRIMARY KEY (LangCode, KeyText)" & _ ")" - + CodeProject.Connection.Execute CreateTableDDL Application.RefreshDatabaseWindow - + CreateL10nDictTable = True - + Exit Function - + HandleErr: CreateL10nDictTable = False @@ -176,9 +176,9 @@ End Property Public Function GetUserLanguageID() As Long Dim AccApp As Object - + Set AccApp = Application - + On Error GoTo AccAppInterFaceErr GetUserLanguageID = AccApp.LanguageSettings.LanguageID(2) @@ -206,14 +206,14 @@ Public Function ControlTag(ByVal TagText As String) As String End Function Private Sub AddTextToTable(ByVal BaseText As String) - + Dim LngText As String - + LngText = BaseText If m_LangCode <> BaseLangCode Then LngText = m_LangCode & ":" & LngText End If - + With CodeDb.OpenRecordset(LngDictTableName, dbOpenTable, dbAppendOnly) .AddNew .Fields("LangCode").Value = LangCode @@ -222,13 +222,13 @@ Private Sub AddTextToTable(ByVal BaseText As String) .Update .Close End With - + End Sub Public Sub TranslateControls(ByVal ControlList As Controls) Dim ctl As Control - + For Each ctl In ControlList TranslateControl ctl Next @@ -247,11 +247,11 @@ Private Sub TranslateControl(ByVal CtlRef As Control) TextKeySeparatorString = Chr(1) TagText = CtlRef.Tag - + If Len(TagText) = 0 Then Exit Sub End If - + Pos = InStr(1, TagText, LangSeparatorChar & "LANG:") If Pos > 0 Then TagTextPrefix = Left(TagText, Pos) @@ -275,9 +275,9 @@ Private Sub TranslateControl(ByVal CtlRef As Control) End If End If End With - + SetControlText CtlRef, ControlTextKeys - + End Sub Private Function GetControlTextKeys(ByVal CtlRef As Control) As String() @@ -290,7 +290,7 @@ Private Function GetControlTextKeys(ByVal CtlRef As Control) As String() With CtlRef ControlTipText = .ControlTipText - + Select Case .ControlType Case AcControlType.acLabel CaptionText = .Caption @@ -304,12 +304,12 @@ Private Function GetControlTextKeys(ByVal CtlRef As Control) As String() StatusBarText = .StatusBarText End Select End With - + ControlTextKeys(0) = CaptionText ControlTextKeys(1) = ControlTipText ControlTextKeys(2) = StatusBarText ControlTextKeys(3) = FormatText - + GetControlTextKeys = ControlTextKeys End Function @@ -320,19 +320,19 @@ Private Sub SetControlText(ByVal CtlRef As Control, ByRef ControlTextKeys() As S If Len(ControlTextKeys(0)) > 0 Then .Caption = Text(ControlTextKeys(0)) End If - + If Len(ControlTextKeys(1)) > 0 Then .ControlTipText = Text(ControlTextKeys(1)) End If - + If Len(ControlTextKeys(2)) > 0 Then .StatusBarText = Text(ControlTextKeys(2)) End If - + If Len(ControlTextKeys(3)) > 0 Then .Format = Text(ControlTextKeys(3)) End If - + End With End Sub @@ -342,15 +342,15 @@ Public Function MsgBox(ByVal Prompt As Variant, _ Optional ByVal Title As Variant, _ Optional ByVal HelpFile As Variant, _ Optional ByVal Context As Variant) As VbMsgBoxResult - + If Not IsMissing(Prompt) Then Prompt = Me.Text(Prompt) End If - + If Not IsMissing(Title) Then Title = Me.Text(Title) End If - + MsgBox = VBA.MsgBox(Prompt, Buttons, Title, HelpFile, Context) End Function @@ -365,11 +365,11 @@ Public Function InputBox(ByVal Prompt As Variant, _ If Not IsMissing(Prompt) Then Prompt = Me.Text(Prompt) End If - + If Not IsMissing(Title) Then Title = Me.Text(Title) End If - + InputBox = VBA.InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context) End Function diff --git a/source/codelib/localization/L10nTools.bas b/source/modules/L10nTools.bas similarity index 97% rename from source/codelib/localization/L10nTools.bas rename to source/modules/L10nTools.bas index 8c54552..b8c056e 100644 --- a/source/codelib/localization/L10nTools.bas +++ b/source/modules/L10nTools.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "L10nTools" +Attribute VB_Name = "L10nTools" '--------------------------------------------------------------------------------------- ' Package: localization.L10nTools '--------------------------------------------------------------------------------------- @@ -6,7 +6,7 @@ Attribute VB_Name = "L10nTools" ' Localization (L10n) Functions ' ' Author: -' Josef Pötzl +' Josef Pötzl ' ' Remarks: ' Use compiler constant L10nMsgBoxReplacement to overwrite MsgBox and InPutBox functions. diff --git a/source/codelib/data/odbc/OdbcHandler.cls b/source/modules/OdbcHandler.cls similarity index 95% rename from source/codelib/data/odbc/OdbcHandler.cls rename to source/modules/OdbcHandler.cls index bf11e72..d928cfe 100644 --- a/source/codelib/data/odbc/OdbcHandler.cls +++ b/source/modules/OdbcHandler.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -122,7 +122,7 @@ Public Event DbObjectDeleted(ByVal LastDbObjectName As String, ByVal Counter As ' New values can be passed on via the ByRef parameters. ' '--------------------------------------------------------------------------------------- -Public Event HookInsertIdentityReturn(ByRef InsertSQL As String, _ +Public Event HookInsertIdentityReturn(ByRef InsertSql As String, _ ByRef ActiveDb As DAO.Database, _ ByRef IdentitySelectString As String, _ ByRef ResponseMode As Long, ByRef HookResponseMessage As Variant) @@ -149,7 +149,7 @@ Public Sub Dispose() On Error Resume Next Set m_DaoDb = Nothing - + If Not m_DaoDbBE Is Nothing Then m_DaoDbBE.Close Set m_DaoDbBE = Nothing @@ -186,7 +186,7 @@ End Property '--------------------------------------------------------------------------------------- Public Property Get CurrentDb() As DAO.Database If (m_DaoDb Is Nothing) Then - 'Event auslösen, damit neue Referenz geliefert werden kann + 'Event auslösen, damit neue Referenz geliefert werden kann RaiseEvent ErrorMissingCurrentDb("OdbcHandler.CurrentDb: unavailable CurrentDb-Database", m_DaoDb) End If Set CurrentDb = m_DaoDb @@ -203,7 +203,7 @@ End Property ' Database-Referenz zum Backend ' ' Remarks -' DAO.Database wird über DBEngine.OpenDatabase("", dbDriverComplete, False, ) geöffnet. +' DAO.Database wird über DBEngine.OpenDatabase("", dbDriverComplete, False, ) geöffnet. ' '--------------------------------------------------------------------------------------- Public Property Get CurrentDbBE() As DAO.Database @@ -280,7 +280,7 @@ Public Function OpenRecordset(ByVal Source As String, _ Optional ByVal RecordsetType As DAO.RecordsetTypeEnum = dbOpenForwardOnly, _ Optional ByVal RecordsetOptions As DAO.RecordsetOptionEnum = DAO.RecordsetOptionEnum.dbSeeChanges, _ Optional ByVal LockEdit As DAO.LockTypeEnum = DAO.LockTypeEnum.dbOptimistic) As DAO.Recordset - + If (RecordsetOptions And dbSeeChanges) = 0 Then RecordsetOptions = RecordsetOptions + dbSeeChanges End If @@ -320,7 +320,7 @@ Public Function OpenRecordsetPT(ByVal Source As String, _ If (RecordsetOptions And dbSQLPassThrough) = 0 Then RecordsetOptions = RecordsetOptions + dbSQLPassThrough End If - + Set qdf = Me.CurrentDb.CreateQueryDef("") With qdf .Connect = Me.ConnectionString @@ -352,7 +352,7 @@ Public Function Execute(ByVal CommandText As String, _ Optional ByVal Options As DAO.RecordsetOptionEnum) As Long Dim db As DAO.Database - + Set db = Me.CurrentDbBE If (Options And dbSeeChanges) = 0 Then @@ -380,14 +380,14 @@ End Function Public Function ExecutePT(ByVal CommandText As String, _ Optional ByVal Options As DAO.RecordsetOptionEnum = DAO.RecordsetOptionEnum.dbSQLPassThrough _ ) As Long - + Dim db As DAO.Database Dim qdf As DAO.QueryDef If (Options And dbSQLPassThrough) = 0 Then Options = Options + dbSQLPassThrough End If - + Set db = Me.CurrentDb Set qdf = db.CreateQueryDef("") With qdf @@ -398,7 +398,7 @@ Public Function ExecutePT(ByVal CommandText As String, _ .Execute Options .Close End With - + ExecutePT = db.RecordsAffected End Function @@ -441,10 +441,10 @@ On Error GoTo HandleErr .Close End With Set rst = Nothing - + ExitHere: Exit Function - + HandleErr: If Not (rst Is Nothing) Then rst.Close @@ -495,7 +495,7 @@ On Error GoTo HandleErr ExitHere: Exit Function - + HandleErr: If Not (rst Is Nothing) Then rst.Close @@ -526,30 +526,15 @@ Public Function Lookup(ByVal Expr As String, ByVal Domain As String, _ Optional ByVal Criteria As Variant, _ Optional ByVal ValueIfNull As Variant = Null) As Variant - Dim SelectSql As String - - SelectSql = BuildSelectSql(Expr, Domain, Criteria, False) - Lookup = LookupSql(SelectSql, , ValueIfNull) - -End Function - -Private Function BuildSelectSql(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant, _ - Optional ByVal Distinct As Boolean = False) + Dim SqlText As String - Dim SelectSql As String - - SelectSql = "SELECT " - If Distinct Then - SelectSql = SelectSql & "Distinct " - End If - SelectSql = SelectSql & Expr & " FROM (" & Domain & ")" + SqlText = "SELECT " & Expr & " FROM " & Domain If Not (VarType(Criteria) = vbError) Then If Len(Criteria) > 0 Then - SelectSql = SelectSql & " WHERE " & Criteria + SqlText = SqlText & " WHERE " & Criteria End If End If - - BuildSelectSql = SelectSql + Lookup = Me.LookupSql(SqlText, , ValueIfNull) End Function @@ -568,18 +553,8 @@ End Function ' Long ' '--------------------------------------------------------------------------------------- -Public Function Count(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant, _ - Optional ByVal Distinct As Boolean = False) As Long - - If Distinct Then - If Expr <> "*" Then - Domain = "(" & BuildSelectSql(Expr, Domain, Criteria, True) & ")" - Criteria = vbNullString - End If - End If - +Public Function Count(ByVal Expr As String, ByVal Domain As String, Optional ByVal Criteria As Variant) As Variant Count = Nz(Me.Lookup("Count(" & Expr & ")", Domain, Criteria), 0) - End Function '--------------------------------------------------------------------------------------- @@ -655,7 +630,7 @@ End Function ' Works for Jet only from Jet 4.0 (Access 2000), IdentityTable is only applicable for MSSQL, under MySQL the IDENT_CURRENT function does not exist. ' If HooksEnabled: event HookInsertIdentityReturn will be raised '--------------------------------------------------------------------------------------- -Public Function InsertIdentityReturn(ByVal InsertSQL As String) As Variant +Public Function InsertIdentityReturn(ByVal InsertSql As String) As Variant Dim db As DAO.Database Dim rst As DAO.Recordset @@ -665,25 +640,25 @@ Public Function InsertIdentityReturn(ByVal InsertSQL As String) As Variant Dim HookResponseMessage As Variant Set db = Me.CurrentDbBE - + If m_HooksEnabled Then - RaiseEvent HookInsertIdentityReturn(InsertSQL, db, IdentitySql, HookResponseMode, HookResponseMessage) + RaiseEvent HookInsertIdentityReturn(InsertSql, db, IdentitySql, HookResponseMode, HookResponseMessage) If HookResponseMode <> 0 Then 'Hook ermittelte bereits das Ergebnis InsertIdentityReturn = HookResponseMessage Exit Function End If End If - + On Error GoTo HandleErr - db.Execute InsertSQL, dbFailOnError + db.Execute InsertSql, dbFailOnError RecordsAffected = db.RecordsAffected - + If RecordsAffected = 0 Then - InsertIdentityReturn = Null 'es wurde kein neuer DS angefügt + InsertIdentityReturn = Null 'es wurde kein neuer DS angefügt Exit Function End If - + If Len(IdentitySql) = 0 Then IdentitySql = "SELECT @@Identity" End If @@ -699,7 +674,7 @@ On Error GoTo HandleErr End With Set rst = Nothing Set db = Nothing - + ExitHere: Exit Function @@ -741,13 +716,13 @@ Public Sub LinkTable(ByVal SourceTableName As String, _ Dim tdf As DAO.TableDef Dim Pos As Long Dim NewConnectionString As String - + NewConnectionString = Me.ConnectionString If Len(NewConnectionString) = 0 Then Err.Raise ERRNR_NOCONFIG, _ "LinkTable", "Missing ODBC connection string!" End If - + If Len(LinkedTableName) = 0 Then LinkedTableName = SourceTableName If RemoveSchemaName Then @@ -758,7 +733,7 @@ Public Sub LinkTable(ByVal SourceTableName As String, _ End If LinkedTableName = Replace(LinkedTableName, ".", "_") End If - + Set dbs = Me.CurrentDb dbs.TableDefs.Refresh 'Check if table already exists and is linked. @@ -788,7 +763,7 @@ Public Sub LinkTable(ByVal SourceTableName As String, _ AddTableDefAttribut tdf, dbAttachSavePWD tdf.RefreshLink End If - + Set tdf = Nothing dbs.TableDefs.Refresh Set dbs = Nothing @@ -821,9 +796,9 @@ Public Function RelinkTables(Optional ByVal SavePWD As Boolean = False, _ Err.Raise ERRNR_NOCONFIG, _ "RelinkTable", "Missing ODBC connection string!" End If - + RelinkTablesWorker NewConnectionString, SavePWD, EventPeriod, RelinkedItemCnt - + RelinkTables = RelinkedItemCnt End Function @@ -837,12 +812,12 @@ Private Sub RelinkTablesWorker(ByVal NewConnectionString As String, _ Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim LastTdfName As String - + Set dbs = Me.CurrentDb dbs.TableDefs.Refresh - + For Each tdf In dbs.TableDefs - + If RelinkTableDef(tdf, NewConnectionString, SavePWD) Then RelinkedTableCounter = RelinkedTableCounter + 1 If EventPeriod > 0 Then @@ -852,9 +827,9 @@ Private Sub RelinkTablesWorker(ByVal NewConnectionString As String, _ End If End If End If - + Next tdf - + If EventPeriod > 0 Then If RelinkedTableCounter Mod EventPeriod > 0 Then RaiseEvent DbObjectRelinked(LastTdfName, RelinkedTableCounter) @@ -886,7 +861,7 @@ Public Function RelinkTable(ByVal LinkedTableName As String, _ Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim NewConnectionString As String - + NewConnectionString = Me.ConnectionString If Len(NewConnectionString) = 0 Then Err.Raise ERRNR_NOCONFIG, _ @@ -903,35 +878,35 @@ End Function Private Function RelinkTableDef(ByVal TdfRef As DAO.TableDef, _ ByVal NewConnectionString As String, _ ByVal SavePWD As String) As Boolean - + If Not IsLinkedTable(TdfRef) Then RelinkTableDef = False Exit Function End If - + With TdfRef - + If Left(.Connect, 5) <> "ODBC;" Then Exit Function - + .Connect = NewConnectionString .RefreshLink - + If SavePWD Then AddTableDefAttribut TdfRef, dbAttachSavePWD Else RemoveTableDefAttribut TdfRef, dbAttachSavePWD End If End With - + RelinkTableDef = True - + End Function '--------------------------------------------------------------------------------------- ' Function: RelinkPassThroughQueries '--------------------------------------------------------------------------------------- ' -' Alle Pass-Through-Abfragen neu verknüpfen +' Alle Pass-Through-Abfragen neu verknüpfen ' ' Parameters: ' SavePWD - Save ODBC password in linked table @@ -953,9 +928,9 @@ Public Function RelinkPassThroughQueries(Optional ByVal SavePWD As Boolean = Fal Err.Raise ERRNR_NOCONFIG, _ "RelinkTable", "Missing ODBC connection string!" End If - + RelinkPassThroughQueriesWorker NewConnectionString, SavePWD, EventPeriod, RelinkedItems - + RelinkPassThroughQueries = RelinkedItems End Function @@ -965,18 +940,18 @@ Private Sub RelinkPassThroughQueriesWorker(ByVal NewConnectionString As String, ByVal EventPeriod As Long, _ ByRef RelinkCounter As Long) 'EventPeriod = 0 ... Return is disabled - + Dim dbs As DAO.Database Dim qdf As DAO.QueryDef Dim LastQdfName As String - + Set dbs = Me.CurrentDb dbs.QueryDefs.Refresh - + If Not SavePWD Then NewConnectionString = RemovePasswordFromConnectionString(NewConnectionString) End If - + For Each qdf In dbs.QueryDefs If RelinkPassThroughQueryDef(qdf, NewConnectionString) Then RelinkCounter = RelinkCounter + 1 @@ -989,7 +964,7 @@ Private Sub RelinkPassThroughQueriesWorker(ByVal NewConnectionString As String, End If qdf.Close Next qdf - + If EventPeriod > 0 Then If RelinkCounter Mod EventPeriod > 0 Then RaiseEvent DbObjectRelinked(LastQdfName, RelinkCounter) @@ -1020,16 +995,16 @@ Public Function RelinkPassThroughQuery(ByVal QueryName As String, _ Dim NewConnectionString As String NewConnectionString = Me.ConnectionString - + If Len(NewConnectionString) = 0 Then Err.Raise ERRNR_NOCONFIG, _ "RelinkPassThroughQuery", "Missing ODBC connection string!" End If - + If Not SavePWD Then NewConnectionString = RemovePasswordFromConnectionString(NewConnectionString) End If - + Set dbs = Me.CurrentDb dbs.QueryDefs.Refresh Set qdf = dbs.QueryDefs(QueryName) @@ -1040,15 +1015,15 @@ End Function Private Function RelinkPassThroughQueryDef(ByVal QdfRef As DAO.QueryDef, _ ByVal NewConnectionString As String) As Boolean - + If Not IsPassThroughQuery(QdfRef) Then RelinkPassThroughQueryDef = False Exit Function End If - + QdfRef.Connect = NewConnectionString RelinkPassThroughQueryDef = True - + End Function '--------------------------------------------------------------------------------------- @@ -1068,7 +1043,7 @@ End Function Public Function RelinkTablesAndQueries( _ Optional ByVal SavePWD As Boolean = False, _ Optional ByVal EventPeriod As Long = 0) As Long - + Dim NewConnectionString As String Dim RelinkedCounter As Long @@ -1077,10 +1052,10 @@ Public Function RelinkTablesAndQueries( _ Err.Raise ERRNR_NOCONFIG, _ "RelinkTablesAndQueries", "Missing ODBC connection string!" End If - + 'Tables RelinkTablesWorker NewConnectionString, SavePWD, EventPeriod, RelinkedCounter - + 'Pass through queries RelinkPassThroughQueriesWorker NewConnectionString, SavePWD, EventPeriod, RelinkedCounter @@ -1105,7 +1080,7 @@ End Function ' '--------------------------------------------------------------------------------------- Public Function DeleteOdbcTableDefs(Optional ByVal EventPeriod As Long = 0) As Long - + Dim dbs As DAO.Database Dim tdf As DAO.TableDef Dim i As Long @@ -1114,7 +1089,7 @@ Public Function DeleteOdbcTableDefs(Optional ByVal EventPeriod As Long = 0) As L Dim LastDbObjectName As String Set dbs = Me.CurrentDb - + dbs.TableDefs.Refresh TdfCount = dbs.TableDefs.Count - 1 For i = TdfCount To 0 Step -1 @@ -1123,14 +1098,14 @@ Public Function DeleteOdbcTableDefs(Optional ByVal EventPeriod As Long = 0) As L LastDbObjectName = tdf.Name dbs.TableDefs.Delete LastDbObjectName DeleteCounter = DeleteCounter + 1 - If EventPeriod > 0 Then '0 ... Rückgabe ist deaktiviert + If EventPeriod > 0 Then '0 ... Rückgabe ist deaktiviert If DeleteCounter Mod EventPeriod = 0 Then RaiseEvent DbObjectDeleted(LastDbObjectName, DeleteCounter) End If End If End If Next - + DeleteOdbcTableDefs = DeleteCounter End Function @@ -1149,17 +1124,17 @@ Private Sub RemoveTableDefAttribut(ByRef TdfRef As DAO.TableDef, ByRef Attr As T AttributesValue = TdfRef.Attributes If (AttributesValue And Attr) = Attr Then - + If (TdfRef.Attributes And dbAttachedODBC) = dbAttachedODBC Then AttributesValue = AttributesValue - dbAttachedODBC ElseIf (TdfRef.Attributes And dbAttachedTable) = dbAttachedTable Then AttributesValue = AttributesValue - dbAttachedTable End If - + 'Entfernen AttributesValue = AttributesValue - Attr TdfRef.Attributes = AttributesValue - + End If End Sub @@ -1170,14 +1145,14 @@ Private Sub AddTableDefAttribut(ByRef TdfRef As DAO.TableDef, ByRef Attr As Tabl AttributesValue = TdfRef.Attributes If (AttributesValue And Attr) = 0 Then - + If (TdfRef.Attributes And dbAttachedODBC) = dbAttachedODBC Then AttributesValue = AttributesValue Xor dbAttachedODBC ElseIf (TdfRef.Attributes And dbAttachedTable) = dbAttachedTable Then AttributesValue = AttributesValue Xor dbAttachedTable End If - - 'Ergänzen + + 'Ergänzen AttributesValue = AttributesValue Or Attr TdfRef.Attributes = AttributesValue End If @@ -1219,11 +1194,11 @@ Public Function IsPassThroughQuery(ByVal QueryToCheck As DAO.QueryDef) As Boolea End Function Private Function RemovePasswordFromConnectionString(ByVal OdbcConnectionString As String) As String - + Dim OdbcSettings() As String Dim OdbcSetting As String Dim i As Long - + OdbcSettings = Split(OdbcConnectionString, ";") For i = 0 To UBound(OdbcSettings) OdbcSetting = Trim(OdbcSettings(i)) @@ -1234,5 +1209,5 @@ Private Function RemovePasswordFromConnectionString(ByVal OdbcConnectionString A End If Next RemovePasswordFromConnectionString = Join(OdbcSettings, ";") - + End Function diff --git a/source/OdbcHandlerEventBridge.cls b/source/modules/OdbcHandlerEventBridge.cls similarity index 97% rename from source/OdbcHandlerEventBridge.cls rename to source/modules/OdbcHandlerEventBridge.cls index efcd25d..05324d5 100644 --- a/source/OdbcHandlerEventBridge.cls +++ b/source/modules/OdbcHandlerEventBridge.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END diff --git a/source/codelib/misc/QpcStopwatch.cls b/source/modules/QpcStopwatch.cls similarity index 98% rename from source/codelib/misc/QpcStopwatch.cls rename to source/modules/QpcStopwatch.cls index ea0fafa..693194d 100644 --- a/source/codelib/misc/QpcStopwatch.cls +++ b/source/modules/QpcStopwatch.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -44,7 +44,7 @@ Private p_Timer_Start As Currency 'Win API Private Declare PtrSafe Function QueryPerformanceCounter Lib "kernel32" (QPC As Currency) As Boolean Private Declare PtrSafe Function QueryPerformanceFrequency Lib "kernel32" (QPF As Currency) As Boolean - + Private Sub Class_Initialize() p_Timer_Start = 0 p_Timer = 0 @@ -156,12 +156,12 @@ Public Function TimeString(Optional FormatString As String = "hh:nn:ss", _ Dim FormattedTime As String TimeSec = VBA.Round(Me.TimeMSec / 1000, SecDigits) - + FormattedTime = Format(TimeSerial(0, 0, Fix(TimeSec)), FormatString) If SecDigits > 0 Then FormattedTime = FormattedTime & Format(TimeSec - Fix(TimeSec), "." & String(SecDigits, "0")) End If - + TimeString = FormattedTime - + End Function diff --git a/source/codelib/data/SqlTools.cls b/source/modules/SqlTools.cls similarity index 97% rename from source/codelib/data/SqlTools.cls rename to source/modules/SqlTools.cls index 14fb6ac..6793c2f 100644 --- a/source/codelib/data/SqlTools.cls +++ b/source/modules/SqlTools.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -50,7 +50,7 @@ Private Const SQL_DEFAULT_BOOLTRUESTRING As String = "" ' "" => SqlBooleanTrueSt ' Enter value to disable (e.g. "True or 1") Private Const SQL_DEFAULT_WILDCARD As String = "%" ' % = default value, ' set required variations via SqlWildCardString - + Private Const SqlAndConcatString As String = " And " Private Const SqlOrConcatString As String = " Or " @@ -136,7 +136,7 @@ End Function Public Function NewInstance(ByVal NewSqlDateFormat As String, _ ByVal NewSqlBooleanTrueString As String, _ ByVal NewSqlWildCardString As String) As SqlTools - + Dim NewInst As SqlTools Set NewInst = New SqlTools @@ -265,31 +265,31 @@ Public Function BuildCriteria(ByVal FieldName As String, ByVal FieldDataType As Dim FilterValueString As String Dim OperatorString As String Dim Criteria As String - + If (RelationalOperator And [_IgnoreAll]) = [_IgnoreAll] Then Exit Function End If - + If IsMissing(IgnoreValue) Then If Not DisableIgnoreNullValue Then DisableIgnoreNullValue = True End If IgnoreValue = Null End If - + ' Special cases (part 1): If Not IsArray(FilterValue) Then - + If FilterValue = "{NULL}" Or FilterValue = "{LEER}" Or FilterValue = "{EMPTY}" Then FilterValue = Null DisableIgnoreNullValue = True End If - + If FilterValue2 = "{NULL}" Or FilterValue2 = "{LEER}" Or FilterValue2 = "{EMPTY}" Then FilterValue2 = Null DisableIgnoreNullValue = True End If - + If (RelationalOperator And SQL_AllowSqlDirect) = SQL_AllowSqlDirect Then If FilterValue Like "{*@*}" Then ' Idee von Ulrich: Anwender schreibt SQL-Ausdruck Criteria = Replace(Mid(FilterValue, 2, Len(FilterValue) - 2), "@", FieldName) @@ -300,42 +300,42 @@ Public Function BuildCriteria(ByVal FieldName As String, ByVal FieldDataType As Exit Function End If End If - + End If - + If NullFilterOrEmptyFilter(FieldName, FieldDataType, RelationalOperator, Nz(FilterValue, FilterValue2), IgnoreValue, Criteria, DisableIgnoreNullValue) Then BuildCriteria = Criteria Exit Function End If - + If (RelationalOperator And SQL_SplitValueToArray) = SQL_SplitValueToArray Then If InStr(1, FilterValue, ";") > 0 Then FilterValue = Split(CharTrim(FilterValue, ";"), ";") End If RelationalOperator = RelationalOperator Xor SQL_SplitValueToArray End If - + 'Special cases (part 2): If Not IsArray(FilterValue) Then - + If FieldDataType = SQL_Numeric Then - + If FilterValue = "*" And RelationalOperator = SQL_Equal Then BuildCriteria = BuildCriteria(FieldName, FieldDataType, SQL_Not, Null, Null, 0, True) Exit Function End If - + If IsNull(FilterValue2) Then If TryBuildNumericSpecialCasesCriteria(FieldName, FieldDataType, RelationalOperator, FilterValue, IgnoreValue, DisableIgnoreNullValue, Criteria) Then BuildCriteria = Criteria Exit Function End If End If - + ConfigNumericSpecials RelationalOperator, FilterValue, FilterValue2 - + End If - + End If If TryBuildInCriteria(FieldName, FieldDataType, RelationalOperator, FilterValue, IgnoreValue, Criteria) Then @@ -386,7 +386,7 @@ Public Function BuildCriteria(ByVal FieldName As String, ByVal FieldDataType As BuildCriteria = FieldName & OperatorString & FilterValueString Exit Function End If - + OperatorString = GetRelationalOperatorString(RelationalOperator) Criteria = FieldName & " " & OperatorString & " " & FilterValueString @@ -419,7 +419,7 @@ End Function '--------------------------------------------------------------------------------------- Public Function ConvertToSqlText(ByVal Value As Variant, _ ByVal FieldDataType As SqlFieldDataType) As String - + Select Case FieldDataType Case SqlFieldDataType.SQL_Text ConvertToSqlText = TextToSqlText(Value) @@ -432,7 +432,7 @@ Public Function ConvertToSqlText(ByVal Value As Variant, _ Case Else Err.Raise vbObjectError, "SqlTools.ConvertToSqlText", "FieldDataType '" & FieldDataType & "' not supported" End Select - + End Function '--------------------------------------------------------------------------------------- @@ -457,19 +457,19 @@ End Function Public Function TextToSqlText(ByVal Value As Variant, _ Optional ByVal Delimiter As String = SQL_DEFAULT_TEXTDELIMITER, _ Optional ByVal WithoutLeftRightDelim As Boolean = False) As String - + Dim Result As String - + If IsNull(Value) Then TextToSqlText = ResultTextIfNull Exit Function End If - + Result = Replace$(Value, Delimiter, Delimiter & Delimiter) If Not WithoutLeftRightDelim Then Result = Delimiter & Result & Delimiter End If - + TextToSqlText = Result End Function @@ -495,7 +495,7 @@ Public Function DateToSqlText(ByVal Value As Variant, _ DateToSqlText = ResultTextIfNull Exit Function End If - + If Not IsDate(Value) Then Err.Raise vbObjectError, "SqlTools.DateToSqlText", "Der Wert '" & Value & "' vom Parameter Value ist kein Datumswert!" End If @@ -506,7 +506,7 @@ Public Function DateToSqlText(ByVal Value As Variant, _ Err.Raise SqlToolsErrorNumbers.ERRNR_NOCONFIG, "DateToSqlText", "date format is not defined" End If End If - + DateToSqlText = VBA.Format$(Value, FormatString) End Function @@ -536,26 +536,24 @@ Public Function NumberToSqlText(ByVal Value As Variant) As String NumberToSqlText = ResultTextIfNull Exit Function End If - + Value = ConvertToNumeric(Value) - + Result = Trim$(Str$(Value)) If Left(Result, 1) = "." Then Result = "0" & Result End If - + NumberToSqlText = Result - + End Function Friend Function ConvertToNumeric(ByVal Value As Variant) As Variant - + Const CheckNumber As Double = 1.23 - + Dim CheckText As String - Dim DecimalSeparatorToReplace As String - Dim NewDecimalSeparator As String - + If IsNull(Value) Then ConvertToNumeric = Null Exit Function @@ -563,25 +561,26 @@ Friend Function ConvertToNumeric(ByVal Value As Variant) As Variant ConvertToNumeric = Null Exit Function End If - + CheckText = CStr(CheckNumber) If InStr(1, CheckText, ",") > 0 Then - DecimalSeparatorToReplace = "." - NewDecimalSeparator = "," + If InStr(1, Value, ".") > 0 Then + Value = Replace(Value, ".", ",") + Do While Value Like "*,*,*" + Value = Replace(Value, ",", vbNullString, 1, 1) + Loop + End If Else - DecimalSeparatorToReplace = "," - NewDecimalSeparator = "." - End If - - If InStr(1, Value, DecimalSeparatorToReplace) > 0 Then - Value = Replace(Value, DecimalSeparatorToReplace, NewDecimalSeparator) - Do While Value Like "*" & NewDecimalSeparator & "*" & NewDecimalSeparator & "*" - Value = Replace(Value, NewDecimalSeparator, vbNullString, 1, 1) - Loop - End If - + If InStr(1, Value, ",") > 0 Then + Value = Replace(Value, ",", ".") + Do While Value Like "*.*.*" + Value = Replace(Value, ".", vbNullString, 1, 1) + Loop + End If + End If + ConvertToNumeric = CDbl(Value) - + End Function '--------------------------------------------------------------------------------------- @@ -617,7 +616,7 @@ Public Function BooleanToSqlText(ByVal Value As Variant, _ Else BooleanToSqlText = "0" End If - + End Function Private Function ConfigNumericSpecials( _ @@ -632,7 +631,7 @@ Private Function ConfigNumericSpecials( _ RelationalOperator = RelationalOperator Or SQL_LessThan FilterValue = Mid(FilterValue, 2) End If - + If Left(FilterValue, 1) = ">" Then If ((RelationalOperator And SQL_Equal) = SQL_Equal) Then RelationalOperator = RelationalOperator - SQL_Equal @@ -645,7 +644,7 @@ Private Function ConfigNumericSpecials( _ RelationalOperator = RelationalOperator Or SQL_Equal FilterValue = Mid(FilterValue, 2) End If - + If Right(FilterValue, 1) = "*" Then RelationalOperator = RelationalOperator Or SQL_Add_WildCardSuffix ElseIf Right(FilterValue2, 1) = "*" Then @@ -655,7 +654,7 @@ Private Function ConfigNumericSpecials( _ End Function Private Function GetNextDigitNumber(ByVal Z As Variant, Optional AddToAbsoluteValue As Boolean = False) As Double - + Dim TestString As String Dim KommaPos As Long Dim digits As Long @@ -663,18 +662,18 @@ Private Function GetNextDigitNumber(ByVal Z As Variant, Optional AddToAbsoluteVa Const AdditionalDecDigit As String = "1" Const AdditionalDecDigitKorr As Double = 0.1 - + TestString = Trim(CStr(ConvertToNumeric(Replace(CStr(Z), "*", AdditionalDecDigit)))) - + If Left(TestString, 1) = "-" And (Not AddToAbsoluteValue) Then GetNextDigitNumber = CDbl(Replace(CStr(Z), "*", vbNullString)) Exit Function End If - + If Left(TestString, 1) = "-" Then IsNegativ = True End If - + KommaPos = InStrRev(TestString, DecimalMarker) If KommaPos = 0 Then ' next integer If AddToAbsoluteValue And IsNegativ Then @@ -684,31 +683,31 @@ Private Function GetNextDigitNumber(ByVal Z As Variant, Optional AddToAbsoluteVa End If Exit Function End If - + digits = Len(TestString) - KommaPos - 1 - + If Left(TestString, 1) = "-" Then IsNegativ = True End If - + If AddToAbsoluteValue And IsNegativ Then GetNextDigitNumber = CDbl(TestString) + AdditionalDecDigitKorr / 10 ^ digits - AdditionalDecDigitKorr / 10 ^ (digits - 1) Else GetNextDigitNumber = CDbl(TestString) + (1 - AdditionalDecDigitKorr) / 10 ^ digits End If - + End Function Private Property Get DecimalMarker() As String Static DecChar As String Dim X As String - + If Len(DecChar) = 0 Then X = Trim(CStr(1.2)) DecChar = Mid(X, 2, 1) End If - + DecimalMarker = DecChar End Property @@ -716,17 +715,17 @@ End Property Private Function CharTrim(ByVal ValueToTrim As String, ByVal TrimChar As String) As String Dim TrimString As String - + TrimString = " " & TrimChar Do While InStr(1, ValueToTrim, TrimString) ValueToTrim = Replace(ValueToTrim, TrimString, TrimChar) Loop - + TrimString = TrimChar & " " Do While InStr(1, ValueToTrim, TrimString) ValueToTrim = Replace(ValueToTrim, TrimString, TrimChar) Loop - + CharTrim = ValueToTrim End Function @@ -735,7 +734,7 @@ Friend Function GetRelationalOperatorString(ByRef RelationalOperator As SqlRelat Dim OperatorString As String Dim op As SqlRelationalOperators - + If (RelationalOperator And SQL_In) = SQL_In Then OperatorString = OperatorString & "In" If (RelationalOperator And SQL_Not) = SQL_Not Then @@ -744,14 +743,14 @@ Friend Function GetRelationalOperatorString(ByRef RelationalOperator As SqlRelat GetRelationalOperatorString = OperatorString Exit Function End If - + If (RelationalOperator And SQL_Not) = SQL_Not Then - + op = RelationalOperator Xor SQL_Not - - If op = SqlRelationalOperators.SQL_Equal Then ' => "=" zu "<>" .. null berücksichtigen? + + If op = SqlRelationalOperators.SQL_Equal Then ' => "=" zu "<>" .. null berücksichtigen? RelationalOperator = SQL_LessThan + SQL_GreaterThan - ElseIf op = SQL_GreaterThan + SQL_LessThan Then ' => "<>" zu "=" .. null berücksichtigen? + ElseIf op = SQL_GreaterThan + SQL_LessThan Then ' => "<>" zu "=" .. null berücksichtigen? RelationalOperator = SQL_Equal Else RelationalOperator = RelationalOperator Xor SQL_Not @@ -774,7 +773,7 @@ Friend Function GetRelationalOperatorString(ByRef RelationalOperator As SqlRelat If (RelationalOperator And SQL_LessThan) = SQL_LessThan Then OperatorString = OperatorString & "<" End If - + If (RelationalOperator And SQL_GreaterThan) = SQL_GreaterThan Then OperatorString = OperatorString & ">" End If @@ -861,11 +860,11 @@ Private Function TryBuildNumericSpecialCasesCriteria(ByRef FieldName As String, Dim CriteriaBuild As Boolean Dim TempArr() As String - + Const FilterValue2 As Variant = Null FilterValue = Trim(FilterValue) - + If FilterValue Like "[0-9]*..*[0-9]*" Or FilterValue Like "[+-][0-9]*..*[0-9]*" Then TempArr = Split(FilterValue, "..") Criteria = BuildCriteria(FieldName, FieldDataType, SQL_Between, Trim(TempArr(0)), Trim(TempArr(1)), IgnoreValue, DisableIgnoreNullValue) @@ -879,7 +878,7 @@ Private Function TryBuildNumericSpecialCasesCriteria(ByRef FieldName As String, FilterValue = Replace(FilterValue, "--", "-{M}") FilterValue = Replace(FilterValue, "-", "..") FilterValue = Replace(FilterValue, "{M}", "-") - + TempArr = Split(FilterValue, "..") Criteria = BuildCriteria(FieldName, FieldDataType, SQL_Between, Trim(TempArr(0)), Trim(TempArr(1)), IgnoreValue, DisableIgnoreNullValue) CriteriaBuild = True @@ -889,7 +888,7 @@ Private Function TryBuildNumericSpecialCasesCriteria(ByRef FieldName As String, CriteriaBuild = True End If End If - + TryBuildNumericSpecialCasesCriteria = CriteriaBuild End Function @@ -901,9 +900,9 @@ Private Function TryBuildArrayCriteria(ByRef FieldName As String, ByVal FieldDat ByRef Criteria As String) As Boolean Dim itm As Variant Dim ItmCriteria As String - + Dim arrFilterValue() As Variant - + If Not IsArray(FilterValue) Then Exit Function End If @@ -958,7 +957,7 @@ Private Function TryBuildInCriteria(ByRef FieldName As String, ByVal FieldDataTy End If If Len(FilterValueString) > 0 Then - + If RemoveNullFromInValueString(FilterValueString) Then Criteria = FieldName & " Is Null" If Len(FilterValueString) > 0 Then @@ -967,7 +966,7 @@ Private Function TryBuildInCriteria(ByRef FieldName As String, ByVal FieldDataTy Else Criteria = FieldName & OperatorString & "(" & FilterValueString & ")" End If - + End If TryBuildInCriteria = True @@ -980,15 +979,15 @@ Private Function TryBuildBetweenCriteria(ByRef FieldName As String, ByVal FieldD ByRef FilterValue2 As Variant, _ ByRef IgnoreValue As Variant, _ ByRef Criteria As String) As Boolean - + Dim Criteria1 As String Dim Criteria2 As String - + If (RelationalOperator And SQL_Between) = False Then TryBuildBetweenCriteria = False Exit Function End If - + If (RelationalOperator And SQL_Not) = SQL_Not Then 'Reverse condition Criteria1 = BuildCriteria(FieldName, FieldDataType, SQL_LessThan, FilterValue, , IgnoreValue, False) Criteria2 = BuildCriteria(FieldName, FieldDataType, SQL_GreaterThan, FilterValue2, , IgnoreValue, False) @@ -996,7 +995,7 @@ Private Function TryBuildBetweenCriteria(ByRef FieldName As String, ByVal FieldD TryBuildBetweenCriteria = True Exit Function End If - + If FieldDataType = SQL_Numeric Then If FilterValue2 Like "<=*" Then 'cut away FilterValue2 = Mid(FilterValue2, 3) @@ -1049,7 +1048,7 @@ Private Function NullFilterOrEmptyFilter(ByVal FieldName As String, ByVal FieldD ByVal Value As Variant, ByVal IgnoreValue As Variant, _ ByRef NullFilterString As String, _ Optional ByVal DisableIgnoreNullValue As Boolean = False) As Boolean - + If IsObject(IgnoreValue) Then If IgnoreValue Is Nothing Then If IsNull(Value) Then @@ -1065,7 +1064,7 @@ Private Function NullFilterOrEmptyFilter(ByVal FieldName As String, ByVal FieldD Exit Function End If End If - + If IsNull(Value) Then If DisableIgnoreNullValue Then NullFilterString = FieldName & " Is Null" @@ -1095,7 +1094,7 @@ On Error Resume Next Else NullFilterOrEmptyFilter = ValuesAreEqual(FieldDataType, Value, IgnoreValue) End If - + If (RelationalOperator And SQL_Not) = SQL_Not Then NullFilterString = Replace(NullFilterString, "Is Null", "Is Not Null") End If @@ -1103,7 +1102,7 @@ On Error Resume Next End Function Private Function ValuesAreEqual(ByVal FieldDataType As SqlFieldDataType, ByVal Value As Variant, ByVal Value2 As Variant) As Boolean - + If IsArray(Value2) Then ValuesAreEqual = ArrayContains(FieldDataType, Value2, Value) ElseIf IsNull(Value) Then @@ -1128,7 +1127,7 @@ Private Function ValuesAreEqual(ByVal FieldDataType As SqlFieldDataType, ByVal V End Function Private Function ArrayContains(ByVal FieldDataType As SqlFieldDataType, ByVal ArrayToCheck As Variant, ByVal SearchValue As Variant) As Boolean - + Dim i As Long If IsNull(SearchValue) Then @@ -1148,7 +1147,7 @@ Private Function ArrayContains(ByVal FieldDataType As SqlFieldDataType, ByVal Ar End Function Private Function ArrayContainsNull(ByVal ArrayToCheck As Variant) As Boolean - + Dim i As Long For i = LBound(ArrayToCheck) To UBound(ArrayToCheck) @@ -1164,7 +1163,7 @@ End Function Private Function GetValueArrayString(ByVal Value As Variant, ByVal FieldDataType As SqlFieldDataType, _ ByVal Delimiter As String, ByVal IgnoreValue As Variant) As String - + Dim i As Long Dim s As String @@ -1193,22 +1192,22 @@ Private Function RemoveNullFromInValueString(ByRef ValueString As String) As Boo Const NullCheckString As String = ",Null," Dim TestString As String - + TestString = "," & ValueString & "," If Not (InStr(1, TestString, NullCheckString) > 0) Then RemoveNullFromInValueString = False Exit Function End If - + TestString = Replace(TestString, NullCheckString, ",") - + If Len(TestString) > 1 Then ValueString = Mid(TestString, 2, Len(TestString) - 2) Else ValueString = vbNullString End If - + RemoveNullFromInValueString = True End Function diff --git a/source/codelib/text/StringTools.bas b/source/modules/StringTools.bas similarity index 93% rename from source/codelib/text/StringTools.bas rename to source/modules/StringTools.bas index 3255050..f7a88f7 100644 --- a/source/codelib/text/StringTools.bas +++ b/source/modules/StringTools.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "StringTools" +Attribute VB_Name = "StringTools" Attribute VB_Description = "String-Hilfsfunktionen" '--------------------------------------------------------------------------------------- ' Package: text.StringTools @@ -9,10 +9,6 @@ Attribute VB_Description = "String-Hilfsfunktionen" ' Author: ' Josef Poetzl, Sten Schmidt ' -' Remarks: -' Use DisableReplaceVbaStringFunctions = 1 in conditional compilation arguments (in vbe project properties) -' to disable replacement of VBA.Format function -' '--------------------------------------------------------------------------------------- '--------------------------------------------------------------------------------------- @@ -59,22 +55,22 @@ End Enum ' '--------------------------------------------------------------------------------------- Public Function IsNullOrEmpty(ByVal ValueToTest As Variant, Optional ByVal IgnoreSpaces As Boolean = False) As Boolean - + Dim TempValue As String - + If IsNull(ValueToTest) Then IsNullOrEmpty = True Exit Function End If - + TempValue = CStr(ValueToTest) - + If IgnoreSpaces Then TempValue = Trim$(TempValue) End If - + IsNullOrEmpty = (Len(TempValue) = 0) - + End Function '--------------------------------------------------------------------------------------- @@ -96,17 +92,17 @@ Public Function FormatText(ByVal FormatString As String, ParamArray Args() As Va Dim Arg As Variant Dim Temp As String Dim i As Long - + #If USELOCALIZATION = 1 Then FormatString = L10n.Text(FormatString) #End If - + Temp = FormatString For Each Arg In Args Temp = Replace(Temp, "{" & i & "}", CStr(Arg)) i = i + 1 Next - + FormatText = Temp End Function @@ -128,28 +124,20 @@ End Function ' String ' '--------------------------------------------------------------------------------------- -#If DisableReplaceVbaStringFunctions = 0 Then Public Function Format(ByVal Expression As Variant, Optional ByVal FormatString As Variant, _ Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbSunday, _ Optional ByVal FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1) As String - Format = FormatX(Expression, FormatString, FirstDayOfWeek, FirstWeekOfYear) -End Function -#End If - -Public Function FormatX(ByVal Expression As Variant, Optional ByVal FormatString As Variant, _ - Optional ByVal FirstDayOfWeek As VbDayOfWeek = vbSunday, _ - Optional ByVal FirstWeekOfYear As VbFirstWeekOfYear = vbFirstJan1) As String Dim Hours As Long - + If Not IsDate(Expression) Then - If IsNumeric(Expression) Then ' falls Zeitberechnung übergeben wird, ohne auf CDate zu konvertieren + If IsNumeric(Expression) Then ' falls Zeitberechnung übergeben wird, ohne auf CDate zu konvertieren If InStr(1, Replace(FormatString, "[hh]", "[h]"), "[h]") > 0 Then Expression = CDate(Expression) End If End If End If - + If IsDate(Expression) Then If InStr(1, FormatString, "[h", vbTextCompare) > 0 Then Hours = Fix(Round(CDate(Expression) * 24, 1)) @@ -162,8 +150,8 @@ Public Function FormatX(ByVal Expression As Variant, Optional ByVal FormatString End If End If End If - - FormatX = VBA.Format$(Expression, FormatString, FirstDayOfWeek, FirstWeekOfYear) + + Format = VBA.Format$(Expression, FormatString, FirstDayOfWeek, FirstWeekOfYear) End Function @@ -320,7 +308,7 @@ End Function ' '--------------------------------------------------------------------------------------- Public Function Trim(ByVal Value As String, Optional ByVal TrimType As TrimOption = TrimOption.TrimBoth) As String - + Select Case TrimType Case TrimOption.TrimBoth Trim = VBA.Trim$(Value) @@ -335,7 +323,7 @@ Public Function Trim(ByVal Value As String, Optional ByVal TrimType As TrimOptio Trim = Value Exit Function End Select - + End Function '--------------------------------------------------------------------------------------- @@ -402,7 +390,7 @@ Public Function Replicate(ByVal Value As String, ByVal Number As Long) As String Dim ValueLen As Long Dim TempString As String Dim i As Long - + If Number = 0 Then Replicate = vbNullString Exit Function @@ -410,9 +398,9 @@ Public Function Replicate(ByVal Value As String, ByVal Number As Long) As String Replicate = Value Exit Function End If - + ValueLen = Len(Value) - + If ValueLen = 0 Then Replicate = vbNullString Exit Function @@ -420,13 +408,13 @@ Public Function Replicate(ByVal Value As String, ByVal Number As Long) As String Replicate = String$(Number, Value) Exit Function End If - + TempString = String$(Number * ValueLen, Chr(0)) - + For i = 1 To Number Mid$(TempString, (i - 1) * ValueLen + 1, ValueLen) = Value Next - + Replicate = TempString - + End Function diff --git a/source/codelib/_codelib/addins/shared/VbeTools.cls b/source/modules/VbeTools.cls similarity index 99% rename from source/codelib/_codelib/addins/shared/VbeTools.cls rename to source/modules/VbeTools.cls index 477a780..2e8971b 100644 --- a/source/codelib/_codelib/addins/shared/VbeTools.cls +++ b/source/modules/VbeTools.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -82,7 +82,7 @@ Friend Property Get FindVbProject(ByVal FilePath As String) As Object End If Next End If - + Set FindVbProject = Proj End Property @@ -138,7 +138,7 @@ Public Function CodeModuleExists(ByVal CodeModulName As String, Optional VbProje If VbProjectToScan Is Nothing Then Set VbProjectToScan = CurrentVbProject End If - + Set VbcCol = VbProjectToScan.VBComponents For Each vbc In VbcCol If vbc.Name = CodeModulName Then @@ -146,5 +146,5 @@ Public Function CodeModuleExists(ByVal CodeModulName As String, Optional VbProje Exit For End If Next - + End Function diff --git a/source/codelib/api/winapi/WinApiFileInfo.cls b/source/modules/WinApiFileInfo.cls similarity index 99% rename from source/codelib/api/winapi/WinApiFileInfo.cls rename to source/modules/WinApiFileInfo.cls index 36a9c7b..9f597fd 100644 --- a/source/codelib/api/winapi/WinApiFileInfo.cls +++ b/source/modules/WinApiFileInfo.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -141,38 +141,38 @@ Private Function GetVersion(ByVal FilePath As String, _ GetVersion = False Exit Function End If - + ReDim BufferString(Size) Ret = GetFileVersionInfo(FilePath, 0&, Size, BufferString(0)) If Ret = 0 Then GetVersion = False Exit Function End If - + Ret = VerQueryValue(BufferString(0), "\", VerPointer, VerBufLen) If Ret = 0 Then GetVersion = False Exit Function End If - + Call MoveMemory(FileInfo, VerPointer, Len(FileInfo)) - + With FileInfo - + GetFileInfo.FileVersion = _ Trim$(Str$((.dwFileVersionMS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwFileVersionMS And &HFFFF&)) & "." & _ Trim$(Str$((.dwFileVersionLS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwFileVersionLS And &HFFFF&)) - + GetFileInfo.ProductVersion = _ Trim$(Str$((.dwProductVersionMS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwProductVersionMS And &HFFFF&)) & "." & _ Trim$(Str$((.dwProductVersionLS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwProductVersionLS And &HFFFF&)) - + End With - + GetVersion = True End Function diff --git a/source/codelib/api/winapi/WinApiLayoutTools.cls b/source/modules/WinApiLayoutTools.cls similarity index 99% rename from source/codelib/api/winapi/WinApiLayoutTools.cls rename to source/modules/WinApiLayoutTools.cls index ef80de9..3647fdb 100644 --- a/source/codelib/api/winapi/WinApiLayoutTools.cls +++ b/source/modules/WinApiLayoutTools.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -110,9 +110,9 @@ Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal DC As Long, ByVal Inde ' '--------------------------------------------------------------------------------------- Public Sub SetBackColor(ByVal Hwnd As LongPtr, ByVal Color As Long) - + Dim NewBrush As LongPtr - + 'Create Brush NewBrush = CreateSolidBrush(Color) 'Assign Brush diff --git a/source/codelib/api/winapi/WinApiShortcutMenu.cls b/source/modules/WinApiShortcutMenu.cls similarity index 97% rename from source/codelib/api/winapi/WinApiShortcutMenu.cls rename to source/modules/WinApiShortcutMenu.cls index c3cd540..9aa31a8 100644 --- a/source/codelib/api/winapi/WinApiShortcutMenu.cls +++ b/source/modules/WinApiShortcutMenu.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -20,7 +20,7 @@ Attribute VB_Exposed = False ' ' Remarks: '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -' | Adapted variant from API example by Jörg Ostendorp of AEK10 +' | Adapted variant from API example by Jörg Ostendorp of AEK10 '+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ' '--------------------------------------------------------------------------------------- @@ -132,14 +132,14 @@ Private Declare PtrSafe Function GetWindowRect _ ByVal Hwnd As LongPtr, _ ByRef lpRect As RECT _ ) As LongPtr - + Private Declare PtrSafe Function SetMenuDefaultItem _ Lib "user32" ( _ ByVal hMenu As LongPtr, _ ByVal uItem As LongPtr, _ ByVal fByPos As LongPtr _ ) As LongPtr - + #Else Private m_Helper As Long 'Auxiliary window handle @@ -223,7 +223,7 @@ Private Declare Function GetWindowRect _ ByVal Hwnd As Long, _ ByRef lpRect As RECT _ ) As Long - + Private Declare Function SetMenuDefaultItem _ Lib "user32" ( _ ByVal hMenu As Long, _ @@ -232,7 +232,7 @@ Private Declare Function SetMenuDefaultItem _ ) As Long #End If - + 'Message Private Const WM_COMMAND As Long = &H111 Private Const WM_MOUSELEAVE As Long = &H2A3 @@ -316,7 +316,7 @@ Public Property Get MenuControl() As Access.Control End Property Public Property Set MenuControl(ByRef MnuCtl As Access.Control) - + #If VBA7 Then Dim lngSectionHwnd As LongPtr #Else @@ -325,7 +325,7 @@ Public Property Set MenuControl(ByRef MnuCtl As Access.Control) Dim ParentObj As Object Set m_MenuControl = MnuCtl - + Set ParentObj = m_MenuControl.Parent If TypeOf ParentObj Is Access.Page Then Set ParentObj = ParentObj.Parent.Parent @@ -333,23 +333,23 @@ Public Property Set MenuControl(ByRef MnuCtl As Access.Control) If m_AccessForm Is Nothing Then Set m_AccessForm = ParentObj End If - + Select Case m_Section Case 0 'Detailbereich lngSectionHwnd = WindowTools.GetDetailSection(ParentObj.Hwnd) Case 1 'Kopf lngSectionHwnd = WindowTools.GetHeaderSection(ParentObj.Hwnd) - Case 2 ' Fuß + Case 2 ' Fuß lngSectionHwnd = WindowTools.GetFooterSection(ParentObj.Hwnd) Case Else lngSectionHwnd = WindowTools.GetDetailSection(ParentObj.Hwnd) End Select Set ParentObj = Nothing - + 'DoCmd.Restore '??? wozu ??? 'Hilfsfenster am Ursprung des Detailbereichs erstellen zur Positionsbestimmung 'wenn das Formular gescrollt wird - + m_Helper = CreateWindowEx(0, _ "Static", _ "Helper", _ @@ -357,9 +357,9 @@ Public Property Set MenuControl(ByRef MnuCtl As Access.Control) 0, 0, 0, 0, _ lngSectionHwnd, _ 0, 0, 0) - 'Wenn die Buttons nicht im Detailbereich sondern im Header oder Footer eingefügt werden, + 'Wenn die Buttons nicht im Detailbereich sondern im Header oder Footer eingefügt werden, 'kann auf das Hilsfenter verzichtet werden. Da diese Bereiche nicht gescrollt werden - 'können, können Sie auch direkt zur Positionsbestimmung des Kontextmenüs herangezogen + 'können, können Sie auch direkt zur Positionsbestimmung des Kontextmenüs herangezogen 'werden ' => ??? wie ? @@ -390,10 +390,10 @@ Public Sub AddMenuItem(ByVal MenuItemNumber As Long, ByVal ItemText As String, _ Optional ByVal ItemType As MenuItemStyle = MF_STRING, _ Optional ByVal SubMenu As Long = 0, _ Optional ByVal DefaultItem As Boolean = False) - + m_ItemCnt = m_ItemCnt + 1 ReDim Preserve m_MenuItems(m_ItemCnt) - + With m_MenuItems(m_ItemCnt) .ItemNumber = MenuItemNumber .ItemText = ItemText @@ -408,7 +408,7 @@ End Sub ' Function: OpenMenu '--------------------------------------------------------------------------------------- ' -' Öffnet das Popup-Menü +' Öffnet das Popup-Menü ' ' Parameters: ' X - desired X position ... can be omitted if Control was specified @@ -436,19 +436,19 @@ Public Function OpenMenu(Optional ByVal X As Single = 0, Optional ByVal Y As Sin Dim ButtonTop As Long Dim XPos As Long Dim YPos As Long - + Dim ParentObj As Object Dim AccFormRect As RECT 'Otherwise, nothing is displayed when ENTER is pressed: DoEvents - + 'Create empty menu MenuHwnd = CreatePopupMenu - + 'Add entries Dim i As Long - + For i = 1 To m_ItemCnt With m_MenuItems(i) If .SubMenu > 0 Then @@ -464,17 +464,17 @@ Public Function OpenMenu(Optional ByVal X As Single = 0, Optional ByVal Y As Sin Else AppendMenu MenuHwnd, .ItemType, .ItemNumber, .ItemText End If - + If .DefaultItem Then SetMenuDefaultItem MenuHwnd, .ItemNumber - 1, &H400& - + End With - + Next i 'Determine position '- Auxiliary window (~section window) absolute GetWindowRect m_Helper, RcHelper - + If m_MenuControl Is Nothing Then GetWindowRect m_AccessForm.Hwnd, AccFormRect ButtonLeft = LayoutTools.GetPixelFromTwips(X) + AccFormRect.Left @@ -487,9 +487,9 @@ Public Function OpenMenu(Optional ByVal X As Single = 0, Optional ByVal Y As Sin '- calc with each other XPos = RcHelper.Left + ButtonLeft - 1 YPos = RcHelper.Top + ButtonTop - + 'Show menu - + If m_MenuControl Is Nothing Then Set ParentObj = m_AccessForm Else @@ -498,25 +498,25 @@ Public Function OpenMenu(Optional ByVal X As Single = 0, Optional ByVal Y As Sin Set ParentObj = ParentObj.Parent.Parent End If End If - + TrackPopupMenu MenuHwnd, TPM_BOTTOMALIGN, XPos, YPos, _ ByVal 0&, ParentObj.Hwnd, ByVal 0& - + 'Message-Loop (Attention: for normal forms Application.hWndAccessApp, for POPUPS Form.Hwnd) - + If m_AccessForm.PopUp = True Then Hwnd = m_AccessForm.Hwnd Else Hwnd = Application.hWndAccessApp End If - + Dim RepeatGetMessage As Boolean Do ' Security sleep in case there are problems with windows message. (WM_MOUSELEAVE] RepeatGetMessage = False GetMessage Message, Hwnd, ByVal 0&, ByVal 0& TranslateMessage Message DispatchMessage Message - + 'Evaluate message If Message.Message = WM_COMMAND Then OpenMenu = Message.wParam @@ -526,7 +526,7 @@ Public Function OpenMenu(Optional ByVal X As Single = 0, Optional ByVal Y As Sin OpenMenu = 0 End If Loop While RepeatGetMessage - + 'Destroy menu DestroyMenu MenuHwnd diff --git a/source/codelib/api/winapi/WinApiWindowTools.cls b/source/modules/WinApiWindowTools.cls similarity index 89% rename from source/codelib/api/winapi/WinApiWindowTools.cls rename to source/modules/WinApiWindowTools.cls index 084dd7e..ef1e5cc 100644 --- a/source/codelib/api/winapi/WinApiWindowTools.cls +++ b/source/modules/WinApiWindowTools.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END @@ -19,7 +19,7 @@ Attribute VB_Exposed = False ' Source info: '--------------------------------------------------------------------------------------- '| The procedures GetMDI, GetHeaderSection, GetDetailSection, GetFooterSection and GetControl -'| are taken from the AEK10 lecture by Jörg Ostendorp +'| are taken from the AEK10 lecture by Jörg Ostendorp '--------------------------------------------------------------------------------------- ' '--------------------------------------------------------------------------------------- @@ -149,15 +149,15 @@ End Function Public Function GetControl(ByRef FormRef As Access.Form, ByVal Hwnd As LongPtr, _ ByVal ClassName As String, ByVal ControlName As String) As LongPtr - 'Exitieren mehrere Controls der gleichen Klasse auf einem Formular, z.B. TabControls, besteht das Problem, daß + 'Exitieren mehrere Controls der gleichen Klasse auf einem Formular, z.B. TabControls, besteht das Problem, daß 'deren Reihenfolge nicht definiert ist (anders also als bei den Sektionsfenstern) 'In diesem Fall kann man alle Kindfenster dieser Klasse in einer Schleife durchlaufen - 'und z.B. prüfen, ob die Position des Fensters des zurückgegebenen Handles - 'mit der des Access-Steuerelementes übereinstimmt. - 'Nachfolgend wird hierfür die undokumentierte Funktion accHittest verwendet. + 'und z.B. prüfen, ob die Position des Fensters des zurückgegebenen Handles + 'mit der des Access-Steuerelementes übereinstimmt. + 'Nachfolgend wird hierfür die undokumentierte Funktion accHittest verwendet. 'Dieser werden als Parameter die Screenkoordinaten der linken oberen Ecke eines - 'Steuerelementes übergeben. Befindet sich dort ein Objekt, erhält man dieses als Rückgabewert. - 'Ist der Name des Objektes identisch mit dem übergebenen Steuerelementnamen, so + 'Steuerelementes übergeben. Befindet sich dort ein Objekt, erhält man dieses als Rückgabewert. + 'Ist der Name des Objektes identisch mit dem übergebenen Steuerelementnamen, so 'hat man das Handle ermittelt: On Error Resume Next @@ -169,11 +169,11 @@ On Error Resume Next h = 0 Do - 'Erstes (h=0)/nächstes (h<>0) Control auf dem Sektionsfenster ermitteln + 'Erstes (h=0)/nächstes (h<>0) Control auf dem Sektionsfenster ermitteln h = FindWindowEx(Hwnd, h, ClassName, vbNullString) 'Bildschirmkoordinaten dieses Controls ermitteln - 'dafür die Punktkoordinaten aus dem letzten Durchlauf zurücksetzen, sonst wird addiert! + 'dafür die Punktkoordinaten aus dem letzten Durchlauf zurücksetzen, sonst wird addiert! pt.X = 0 pt.Y = 0 ClientToScreen h, pt @@ -187,7 +187,7 @@ On Error Resume Next End If Loop While h <> 0 - 'Handle zurückgeben + 'Handle zurückgeben GetControl = h End Function diff --git a/source/_ADFInterface.cls b/source/modules/_ADFInterface.cls similarity index 94% rename from source/_ADFInterface.cls rename to source/modules/_ADFInterface.cls index adef9c6..5def765 100644 --- a/source/_ADFInterface.cls +++ b/source/modules/_ADFInterface.cls @@ -1,4 +1,4 @@ -VERSION 1.0 CLASS +VERSION 1.0 CLASS BEGIN MultiUse = -1 'True END diff --git a/source/_ADF_Helper.bas b/source/modules/_ADF_Helper.bas similarity index 87% rename from source/_ADF_Helper.bas rename to source/modules/_ADF_Helper.bas index d5ce302..cad764e 100644 --- a/source/_ADF_Helper.bas +++ b/source/modules/_ADF_Helper.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "_ADF_Helper" +Attribute VB_Name = "_ADF_Helper" Option Compare Text Option Explicit diff --git a/source/codelib/_codelib/license.bas b/source/modules/_AccessCodeLib_license.bas similarity index 98% rename from source/codelib/_codelib/license.bas rename to source/modules/_AccessCodeLib_license.bas index 9f34738..a5dab1a 100644 --- a/source/codelib/_codelib/license.bas +++ b/source/modules/_AccessCodeLib_license.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "_AccessCodeLib_license" +Attribute VB_Name = "_AccessCodeLib_license" '--------------------------------------------------------------------------------------- ' access-codelib.net Lizenz '--------------------------------------------------------------------------------------- @@ -53,9 +53,9 @@ Option Compare Text Option Explicit Public Function GetAccessCodeLibLicense() As String - + On Error Resume Next - + GetAccessCodeLibLicense = _ "Copyright (c) access-codelib.net" & vbNewLine & _ "All rights reserved." & vbNewLine & vbNewLine & _ diff --git a/source/_config_Application.bas b/source/modules/_config_Application.bas similarity index 94% rename from source/_config_Application.bas rename to source/modules/_config_Application.bas index 301b77f..d96b5a8 100644 --- a/source/_config_Application.bas +++ b/source/modules/_config_Application.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "_config_Application" +Attribute VB_Name = "_config_Application" ' '############################################################################# '## ## @@ -70,7 +70,7 @@ Private Const ApplicationStartFormName As String = "frmConfig_DBMS" ' ' Konfigurationseinstellungen initialisieren ' -' Möglichkeit einer Referenzübergabe, damit nicht CurrentApplication genutzt werden muss +' Möglichkeit einer Referenzübergabe, damit nicht CurrentApplication genutzt werden muss ' ' ' @@ -89,7 +89,7 @@ Public Sub InitConfig(Optional oCurrentAppHandler As ApplicationHandler = Nothin ' Globale Variablen einstellen ' 'SqlTools.SQL_DATEFORMAT = "\#yyyy-mm-dd\#" 'JET-SQL - + '---------------------------------------------------------------------------- ' Anwendungsinstanz einstellen ' @@ -98,11 +98,11 @@ Public Sub InitConfig(Optional oCurrentAppHandler As ApplicationHandler = Nothin End If With oCurrentAppHandler - + 'Zur Sicherheit AccDb einstellen Set .AppDb = CodeDb 'muss auf CodeDb zeigen, 'da diese Anwendung als Add-In verwendet wird - + 'Anwendungsname .ApplicationName = APPLICATION_NAME .ApplicationFullName = APPLICATION_FULLNAME @@ -115,8 +115,8 @@ Public Sub InitConfig(Optional oCurrentAppHandler As ApplicationHandler = Nothin .ApplicationStartFormName = ApplicationStartFormName End With - - + + '---------------------------------------------------------------------------- ' Erweiterung: ... ' @@ -128,26 +128,26 @@ Public Sub InitConfig(Optional oCurrentAppHandler As ApplicationHandler = Nothin Set m_Extensions = New ApplicationHandler_ExtensionCollection With m_Extensions Set .ApplicationHandler = oCurrentAppHandler - + ' load extensions .Add New ApplicationHandler_AppFile - + Dim AppHdlVersion As ApplicationHandler_Version Set AppHdlVersion = New ApplicationHandler_Version .Add AppHdlVersion AppHdlVersion.XmlVersionCheckFile = APPLICATION_DOWNLOAD_VERSIONXMLFILE - + End With - + #End If - + End Sub '############################################################################ ' -' Funktionen für die Anwendungswartung -' (werden nur im Anwendungsentwurf benötigt) +' Funktionen für die Anwendungswartung +' (werden nur im Anwendungsentwurf benötigt) ' '---------------------------------------------------------------------------- ' Hilfsfunktion zum Speichern von Dateien in die lokale AppFile-Tabelle diff --git a/source/_doc_dbms_wizard.bas b/source/modules/_doc_dbms_wizard.bas similarity index 75% rename from source/_doc_dbms_wizard.bas rename to source/modules/_doc_dbms_wizard.bas index 7d4b209..01e002d 100644 --- a/source/_doc_dbms_wizard.bas +++ b/source/modules/_doc_dbms_wizard.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "_doc_dbms_wizard" +Attribute VB_Name = "_doc_dbms_wizard" '####################################################################################### ' ' Doxygen-Gruppen @@ -12,7 +12,7 @@ Attribute VB_Name = "_doc_dbms_wizard" '/** ' \defgroup grpCodeLib Code-Bibliothek -' Klassen und Module für die Verwendung in den Access-Anwendungen +' Klassen und Module für die Verwendung in den Access-Anwendungen '**/ @@ -39,17 +39,17 @@ Attribute VB_Name = "_doc_dbms_wizard" '/** ' \page wizard_install Installation ' -' Das Access-Add-In wird über den Add-In-Manger durch hinzufügen der Datei DbmsConnectionWizard.mda installiert. +' Das Access-Add-In wird über den Add-In-Manger durch hinzufügen der Datei DbmsConnectionWizard.mda installiert. ' Falls Sie Vista oder Windows 7 verwenden und die Benutzerkontensteuerung (UAC) aktiviert haben, -' starten Sie zuvor Access als Administrator, da für die Registrierung der Assistenten Admin-Rechte notwendig sind. -' Sollten es Ihnen nicht möglich sein, Admin-Rechte zu erhalten, so können Sie das Add-In trotzdem verwenden. -' Es steht Ihnen dann allerdings nur das Menü-Add-In zur Verfügung. +' starten Sie zuvor Access als Administrator, da für die Registrierung der Assistenten Admin-Rechte notwendig sind. +' Sollten es Ihnen nicht möglich sein, Admin-Rechte zu erhalten, so können Sie das Add-In trotzdem verwenden. +' Es steht Ihnen dann allerdings nur das Menü-Add-In zur Verfügung. ' ' ' \page wizard_connection Verbindungsdaten einstellen ' -' Nach der Installation des Access-Add-In steht unter Add-Ins der Eintrag DBMS Connection Wizard zur Verfügung, -' mit dem der Assistent für die Verbindungskonfiguration gestartet werden kann. +' Nach der Installation des Access-Add-In steht unter Add-Ins der Eintrag DBMS Connection Wizard zur Verfügung, +' mit dem der Assistent für die Verbindungskonfiguration gestartet werden kann. ' ' \section sec_wizard_table Tabelle erstellen ' Falls die Tabelle \a usys_DbmsConnection im Frontend fehlt, wird diese vom Assistenten erstellt. @@ -58,7 +58,7 @@ Attribute VB_Name = "_doc_dbms_wizard" ' ' \section sec_wizard_connection Verbindungskonfiguration erstellen ' -' Mit der Schaltfläche "Neue Verbindung" kann eine neue Verbindungskonfiguration angelegt werden. +' Mit der Schaltfläche "Neue Verbindung" kann eine neue Verbindungskonfiguration angelegt werden. ' ' \image html pictures/Neue_Verbindung_erstellen.png "Neue Verbindungskonfiguration erstellen" ' @@ -67,7 +67,7 @@ Attribute VB_Name = "_doc_dbms_wizard" ' \image html pictures/Neue_Verbindung_erstellen_Eingabe.png "Eingeben der Verbindungskennung" ' ' \section sec_wizard_parameter Zugriffsparameter einstellen -' Die Zugriffsparameter werden für jede Verbindungskennung gespeichert. +' Die Zugriffsparameter werden für jede Verbindungskennung gespeichert. ' ' \image html pictures/Verbindungsdaten_einstellen.png "Verbindungsdaten einstellen" ' @@ -107,24 +107,24 @@ Attribute VB_Name = "_doc_dbms_wizard" ' Bei Benutzeranmeldung kann ein Login-formular verwendet werden, um das Passwort abzufragen. (Empfohlene Einstellung, wenn die Windows-Autentifizierung nicht verwendet wird.) ' ' \par DSN -' Die DSN-Kennung, falls eine Verbindung über DSN aufgebaut werden soll +' Die DSN-Kennung, falls eine Verbindung über DSN aufgebaut werden soll ' ' \section sec_wizard_parameter_3 Provider / Driver ' ' \par OLEDB -' Der OLEDB-Provider. Als Standard wird der gängigste Provider zum jeweiligen DBMS voreingestellt. Diese Einstellung kann in der Tabelle usys_DbmsConnection_X geändert werden. -' Falls ein alternativer Provider verwendet wird, muss möglicherweise die Erstellung der Verbindugnszeichenfolge optimiert werden, falls dieser Provider spezielle Parameter benötigt. +' Der OLEDB-Provider. Als Standard wird der gängigste Provider zum jeweiligen DBMS voreingestellt. Diese Einstellung kann in der Tabelle usys_DbmsConnection_X geändert werden. +' Falls ein alternativer Provider verwendet wird, muss möglicherweise die Erstellung der Verbindugnszeichenfolge optimiert werden, falls dieser Provider spezielle Parameter benötigt. ' ' \par ODBC   -' Der ODBC-Treiber für den DOBC-Zugriff analog zum OLDEDB-Provider. +' Der ODBC-Treiber für den DOBC-Zugriff analog zum OLDEDB-Provider. ' ' \subsection sec_wizard_parameter_4 Weitere Optionen ' ' \par OLEDB -' Zusätzliche OLEDB-Optionen. Dieser werden am Ende der OLEDB-Verbindungszeichenfolge angehängt. +' Zusätzliche OLEDB-Optionen. Dieser werden am Ende der OLEDB-Verbindungszeichenfolge angehängt. ' ' \par ODBC   -' Zusätzliche ODBC-Optionen. Dieser werden am Ende der OLEDB-Verbindungszeichenfolge angehängt. +' Zusätzliche ODBC-Optionen. Dieser werden am Ende der OLEDB-Verbindungszeichenfolge angehängt. ' ' \section sec_wizard_parameter_5 Benutzerdefinierter Connectionstring ' \par OLEDB @@ -134,7 +134,7 @@ Attribute VB_Name = "_doc_dbms_wizard" ' Die ODBC-Verbindungszeichenfolge bei benutzerdefinierter Konfiguration ' ' \section sec_wizard_parameter_6 Module und Klassen -' In diesem Abschnitt könnten die im Frontend benötigten Module aus dem Add-In kopiert werden. +' In diesem Abschnitt könnten die im Frontend benötigten Module aus dem Add-In kopiert werden. ' '**/ ' @@ -154,9 +154,9 @@ Attribute VB_Name = "_doc_dbms_wizard" ' @{ **/ ' ' /** -' \page codelib_samples Beispiele für den Datenzugriff +' \page codelib_samples Beispiele für den Datenzugriff ' -' \section sec_codelib_samples Beispiele für den Datenzugriff +' \section sec_codelib_samples Beispiele für den Datenzugriff ' ' \par DAO ' \code DbCon.DAO.OpenRecordset("select ...") \endcode diff --git a/source/codelib/base/_initApplication.bas b/source/modules/_initApplication.bas similarity index 97% rename from source/codelib/base/_initApplication.bas rename to source/modules/_initApplication.bas index 3db9603..72dd547 100644 --- a/source/codelib/base/_initApplication.bas +++ b/source/modules/_initApplication.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "_initApplication" +Attribute VB_Name = "_initApplication" '--------------------------------------------------------------------------------------- ' Package: base._initApplication '--------------------------------------------------------------------------------------- diff --git a/source/_initDbConnectionWizard.bas b/source/modules/_initDbConnectionWizard.bas similarity index 92% rename from source/_initDbConnectionWizard.bas rename to source/modules/_initDbConnectionWizard.bas index 00ca2a5..7544808 100644 --- a/source/_initDbConnectionWizard.bas +++ b/source/modules/_initDbConnectionWizard.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "_initDbConnectionWizard" +Attribute VB_Name = "_initDbConnectionWizard" '--------------------------------------------------------------------------------------- ' Modul: _initApplication '--------------------------------------------------------------------------------------- @@ -18,7 +18,7 @@ Option Explicit '--------------------------- Private Function InitDbmsConnectionWizard() As Boolean If Application.CurrentDb Is Nothing Then - MsgBox "Bitte öffnen Sie zuerst eine Access-Anwendung.", vbCritical + MsgBox "Bitte öffnen Sie zuerst eine Access-Anwendung.", vbCritical InitDbmsConnectionWizard = False Exit Function End If @@ -65,33 +65,33 @@ Private Sub CheckTemplatesDb() Dim db As DAO.Database Dim tdf As DAO.TableDef - -On Error Resume Next 'falls etwas nicht klappt, einfach übergehen, dann können nur keine Vorlagen verwendet werden - + +On Error Resume Next 'falls etwas nicht klappt, einfach übergehen, dann können nur keine Vorlagen verwendet werden + Set db = CodeDb - + If Not TableDefExists("usys_DbmsConnection", db) Then - + Set tdf = db.CreateTableDef("usys_DbmsConnection") tdf.Connect = ";Database=" & TemplatesDatabaseFile tdf.SourceTableName = "usys_DbmsConnection" db.TableDefs.Append tdf - + ElseIf Len(Dir$(Mid$(db.TableDefs("usys_DbmsConnection").Connect, Len(";Database=") + 1))) = 0 Then - + With db.TableDefs("usys_DbmsConnection") .Connect = ";Database=" & TemplatesDatabaseFile .RefreshLink End With - + End If - + Set db = Nothing End Sub Private Property Get TemplatesDatabaseFile() As String - + Dim db As DAO.Database Dim cnn As ADODB.Connection Dim strDbFile As String @@ -101,7 +101,7 @@ Private Property Get TemplatesDatabaseFile() As String If Len(Dir$(strPath, vbDirectory)) = 0 Then MkDir strPath End If - + strDbFile = CodeDb.Name strDbFile = Mid$(strDbFile, InStrRev(strDbFile, ".")) If Left$(strDbFile, 5) = ".accd" Then @@ -110,7 +110,7 @@ Private Property Get TemplatesDatabaseFile() As String strDbFile = ".mdt" End If strDbFile = strPath & "\ConnectionTemplates" & strDbFile - + If Len(Dir$(strDbFile)) = 0 Then 'Datenbank anlegen @@ -120,7 +120,7 @@ Private Property Get TemplatesDatabaseFile() As String Set db = DBEngine.CreateDatabase(strDbFile, dbLangGeneral) End If db.Close - + 'Tabelle erstellen Set cnn = New ADODB.Connection cnn.ConnectionString = Replace(CodeProject.Connection.ConnectionString, CodeDb.Name, strDbFile) @@ -128,8 +128,8 @@ Private Property Get TemplatesDatabaseFile() As String CreateConnectionTable cnn cnn.Close Set cnn = Nothing - - 'Beispiel-Vorlagen einfügen + + 'Beispiel-Vorlagen einfügen Set db = DBEngine.OpenDatabase(strDbFile, False, False) db.Execute "insert into usys_DbmsConnection (" & DCW_usys_DbmsConnection_Fields & ") select " & DCW_usys_DbmsConnection_Fields & " from [" & CodeDb.Name & "].usys_DbmsConnection_CopyBase" db.Close diff --git a/source/codelib/data/defDbConnection.bas b/source/modules/defDbConnection.bas similarity index 98% rename from source/codelib/data/defDbConnection.bas rename to source/modules/defDbConnection.bas index f13eadf..c6bdee1 100644 --- a/source/codelib/data/defDbConnection.bas +++ b/source/modules/defDbConnection.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "defDbConnection" +Attribute VB_Name = "defDbConnection" '--------------------------------------------------------------------------------------- ' Package: data.defDbConnection '--------------------------------------------------------------------------------------- diff --git a/source/defDbmsConnectionWizard.bas b/source/modules/defDbmsConnectionWizard.bas similarity index 83% rename from source/defDbmsConnectionWizard.bas rename to source/modules/defDbmsConnectionWizard.bas index 2d5ed90..dd84db8 100644 --- a/source/defDbmsConnectionWizard.bas +++ b/source/modules/defDbmsConnectionWizard.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "defDbmsConnectionWizard" +Attribute VB_Name = "defDbmsConnectionWizard" '--------------------------------------------------------------------------------------- ' Modul: defGlobalParam '--------------------------------------------------------------------------------------- @@ -15,8 +15,8 @@ Option Private Module Public Const DCW_AppName As String = "DbmsConnectionWizard" Public Const DCW_AppFullName As String = "DBMS Connection Wizard" -Public Const DCW_Version As String = "1.4.7" -Public Const DCW_VersionDate As String = "2023-11-07" +Public Const DCW_Version As String = "1.4.6" +Public Const DCW_VersionDate As String = "2023-07-03" 'Formulare Public Const DCW_LoginFormName As String = "LoginForm" @@ -30,6 +30,6 @@ Public Const DCW_usys_DbmsConnection_Fields As String = "CID, ActiveConnection, Public Enum DCW_RecordsetModes DCW_ADODB = 1 ' ADOD-Recordset - DCW_DAOBE = 2 ' DAO-Recordset über BE-Database - DCW_DAOPT = 3 ' DAO-Recordset über PT-Abfrage + DCW_DAOBE = 2 ' DAO-Recordset über BE-Database + DCW_DAOPT = 3 ' DAO-Recordset über PT-Abfrage End Enum diff --git a/source/modAccessFunctions.bas b/source/modules/modAccessFunctions.bas similarity index 95% rename from source/modAccessFunctions.bas rename to source/modules/modAccessFunctions.bas index 70be910..8381fd6 100644 --- a/source/modAccessFunctions.bas +++ b/source/modules/modAccessFunctions.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modAccessFunctions" +Attribute VB_Name = "modAccessFunctions" '--------------------------------------------------------------------------------------- ' Package: modAccessFunctionReDefine '--------------------------------------------------------------------------------------- @@ -19,15 +19,15 @@ Public Function MsgBox(ByVal Prompt As Variant, _ Optional ByVal Title As Variant, _ Optional ByVal HelpFile As Variant, _ Optional ByVal Context As Variant) As VbMsgBoxResult - + Dim strTitle As String If IsMissing(Title) Then Title = CurrentApplication.ApplicationName End If - + MsgBox = L10n.MsgBox(Prompt, Buttons, Title, HelpFile, Context) - + End Function Public Function InputBox(ByVal Prompt As Variant, _ @@ -36,13 +36,13 @@ Public Function InputBox(ByVal Prompt As Variant, _ Optional ByVal XPos As Variant, Optional ByVal YPos As Variant, _ Optional ByVal HelpFile As Variant, _ Optional ByVal Context As Variant) As String - + Dim strTitle As String If IsMissing(Title) Then Title = CurrentApplication.ApplicationName End If - + InputBox = L10n.InputBox(Prompt, Title, Default, XPos, YPos, HelpFile, Context) - + End Function diff --git a/source/modAccessHelper.bas b/source/modules/modAccessHelper.bas similarity index 97% rename from source/modAccessHelper.bas rename to source/modules/modAccessHelper.bas index 2a7f23c..e504bf7 100644 --- a/source/modAccessHelper.bas +++ b/source/modules/modAccessHelper.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modAccessHelper" +Attribute VB_Name = "modAccessHelper" '--------------------------------------------------------------------------------------- ' Modul: modAccessHelper '--------------------------------------------------------------------------------------- @@ -18,9 +18,9 @@ Public Property Get CurrentVbProject() As Object Dim vbp As Object 'VBProject Dim strCurrentdbFile As String - + On Error Resume Next - + strCurrentdbFile = UncPath(CurrentDb.Name) 'VBProject der Anwendung suchen: @@ -30,7 +30,7 @@ On Error Resume Next Exit For End If Next - + End Property Private Function CheckReferenzes() As Boolean @@ -76,5 +76,5 @@ On Error Resume Next lngVersion = Val(SysCmd(acSysCmdAccessVer)) End If CurrentAccessVersion = lngVersion - + End Function diff --git a/source/modAddIn.bas b/source/modules/modAddIn.bas similarity index 97% rename from source/modAddIn.bas rename to source/modules/modAddIn.bas index 35c3d4e..04a0d79 100644 --- a/source/modAddIn.bas +++ b/source/modules/modAddIn.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modAddIn" +Attribute VB_Name = "modAddIn" Option Compare Text Option Explicit Option Private Module @@ -39,11 +39,11 @@ Public Function CreateConnectionTable(ByRef cnn As ADODB.Connection) As Boolean " [dbmsConStrOLEDB] varchar(255) WITH COMPRESSION," & _ " [Remarks] text WITH COMPRESSION," & _ " CONSTRAINT PK_usys_DbmsConnection PRIMARY KEY ([CID]))" - + cnn.Execute strSQL - + Application.RefreshDatabaseWindow - + CreateConnectionTable = True End Function @@ -64,7 +64,7 @@ End Sub 'Check if login form is available Public Sub CheckLoginForm() - + Dim rst As DAO.Recordset Dim bolMissingForm As Boolean @@ -72,7 +72,7 @@ Public Sub CheckLoginForm() bolMissingForm = rst.EOF rst.Close Set rst = Nothing - + If bolMissingForm Then CodeModulImporter.TransferCodeModul CurrentProject, acForm, DCW_LoginFormName End If @@ -81,29 +81,29 @@ End Sub 'Renew modules + classes Public Function ReplaceCodeModules(ParamArray sModulName() As Variant) As Boolean - + Dim i As Long Dim ArrSize As Long Dim vbp As Object 'VBProject - + Set vbp = CurrentVbProject If Not (vbp Is Nothing) Then ArrSize = UBound(sModulName) For i = 0 To ArrSize - + ' 1. delete If CheckCodeModule(sModulName(i)) Then vbp.VBComponents.Remove vbp.VBComponents(sModulName(i)) End If - + ' 2. check => insert CheckCodeModule sModulName(i), True - + Next ReplaceCodeModules = True End If - + Set vbp = Nothing End Function @@ -111,7 +111,7 @@ End Function 'Check modules and classes for existence. There is no content check! Public Function CheckCodeModules(ParamArray sModulName() As Variant) As Boolean - + Dim i As Long Dim bolModulesExists As Boolean Dim ArrSize As Long @@ -121,7 +121,7 @@ Public Function CheckCodeModules(ParamArray sModulName() As Variant) As Boolean For i = 0 To ArrSize bolModulesExists = bolModulesExists And CheckCodeModule(sModulName(i), False) Next - + CheckCodeModules = bolModulesExists End Function @@ -129,7 +129,7 @@ End Function 'Check module or class for existence. There is no content check! Public Function CheckCodeModule(ByVal sModulName As String, _ Optional ByVal TransferMissingModule As Boolean = False) As Boolean - + Dim rst As DAO.Recordset Dim bolMissingModule As Boolean @@ -137,12 +137,12 @@ Public Function CheckCodeModule(ByVal sModulName As String, _ bolMissingModule = rst.EOF rst.Close Set rst = Nothing - + If bolMissingModule And TransferMissingModule Then CodeModulImporter.TransferCodeModul CurrentProject, acModule, sModulName bolMissingModule = False End If - + CheckCodeModule = Not bolMissingModule End Function diff --git a/source/modAddIn_Files.bas b/source/modules/modAddIn_Files.bas similarity index 96% rename from source/modAddIn_Files.bas rename to source/modules/modAddIn_Files.bas index ebb5ee4..30fac5d 100644 --- a/source/modAddIn_Files.bas +++ b/source/modules/modAddIn_Files.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modAddIn_Files" +Attribute VB_Name = "modAddIn_Files" Option Compare Text Option Explicit Option Private Module @@ -10,7 +10,7 @@ Private Declare PtrSafe Function API_GetTempFilename Lib "kernel32" Alias "GetTe ByVal lpPrefixString As String, _ ByVal wUnique As Long, _ ByVal lpTempFileName As String) As Long - + Private Declare PtrSafe Function GetTempPath Lib "kernel32" Alias "GetTempPathA" ( _ ByVal nBufferLength As Long, _ ByVal lpBuffer As String) As Long @@ -23,7 +23,7 @@ End Sub 'General directory for user settings and changeable data: Public Property Get DbmsConnectionWizardAppDataDirectory() As String - + Dim strPath As String strPath = Environ("Appdata") & "\DbmsConnectionWizard" @@ -41,18 +41,18 @@ Public Property Get AddInHelpFile() As String Dim strVersion As String strHelpFile = DbmsConnectionWizardAppDataDirectory & "\DbmsConnectionWizard.chm" - + Set rst = CodeDb.OpenRecordset("select Version from usys_AppFiles where ID='ChmFile'") If Not rst.EOF Then strVersion = Nz(rst.Fields(0), vbNullString) End If rst.Close Set rst = Nothing - + CheckLibFile "ChmFile", strHelpFile, strVersion - + AddInHelpFile = strHelpFile - + End Property Public Sub OpenHelpFile(Optional ByVal ContextID As Long = 0) @@ -63,7 +63,7 @@ Public Sub OpenHelpFile(Optional ByVal ContextID As Long = 0) WizHook.Key = 51488399 WizHook.WizHelp AddInHelpFile, 1, ContextID End If - + End Sub Public Function CreateAppFile(ByVal sFileID As String, ByVal sFileName As String, _ @@ -89,36 +89,36 @@ Public Function CreateAppFile(ByVal sFileID As String, ByVal sFileName As String ReDim Binfile(lngFieldSize - 1) Binfile = fld.GetChunk(0, lngFieldSize) - + If decode Then CodeDecodeByteArray Binfile, sFileID End If - + #If UseZip Then - + ZipFile = GetTempFileName(, , "zip") f = FreeFile Open ZipFile For Binary As #f Put #f, , Binfile() Close #f - + tempDir = Left$(ZipFile, InStrRev(ZipFile, "\")) TempFile = tempDir & ExtractFromZipFile(ZipFile, tempDir) - + FileCopy TempFile, sFileName Kill TempFile Kill ZipFile - + #Else - + f = FreeFile Open sFileName For Binary As #f Put #f, , Binfile() Close #f - + #End If - + CreateAppFile = True Else CreateAppFile = False @@ -141,16 +141,16 @@ Private Function CheckLibFile(ByVal sFileID As String, ByVal sFileName As String Dim RetVal As Long If Len(Dir$(sFileName)) > 0 Then - + check = True - + If Len(sSavedFileVersion) > 0 Then installedVersionString = modWinAPI_FileInfo.GetFileVersion(sFileName) If Len(installedVersionString) = 0 Then installedVersionString = Format$(Nz(FileDateTime(sFileName), vbNullString), "yyyy.mm.dd") End If - + If sSavedFileVersion <> installedVersionString Then installedVersion = Split(installedVersionString, ".") savedVersion = Split(sSavedFileVersion, ".") @@ -163,14 +163,14 @@ Private Function CheckLibFile(ByVal sFileID As String, ByVal sFileName As String If NewVersion Then RetVal = vbYes - + If RetVal = vbYes Then - + 'Rename file only (delete only after successful recreation) saveFileName = sFileName & ".saved" If Len(Dir$(saveFileName)) > 0 Then Kill saveFileName Name sFileName As saveFileName - + 'Create new file check = CreateAppFile(sFileID, sFileName) If check Then @@ -218,7 +218,7 @@ Private Function SaveAppFile(ByVal sFileID As String, ByVal sFileName As String, Dim ZipFile As String ZipFile = GetTempFileName(, , "zip") AddToZipFile ZipFile, sFileName - + f = FreeFile Open ZipFile For Binary As #f lngFileSize = LOF(f) @@ -227,9 +227,9 @@ Private Function SaveAppFile(ByVal sFileID As String, ByVal sFileName As String, Get #f, , Binfile() End If Close #f - + Kill ZipFile - + #Else f = FreeFile @@ -242,7 +242,7 @@ Private Function SaveAppFile(ByVal sFileID As String, ByVal sFileName As String, Close #f #End If - + If encode Then CodeDecodeByteArray Binfile, sFileID End If @@ -273,30 +273,30 @@ Private Sub SaveModulesInTable() Dim X As Variant Dim i As Long - + X = Array("SqlTools", "defDbConnection", "DbConnectionInfo", "AdodbHandler", "DaoHandler", "OdbcHandler", "DbConnectionHandler", "DbConnectionManager", "modDbConnection") For i = 0 To UBound(X) SaveCodeModulInTable acModule, X(i) Next - + X = Array("LoginForm") For i = 0 To UBound(X) SaveCodeModulInTable acForm, X(i) Next - + End Sub Private Sub SaveCodeModulInTable(ByVal ObjType As AcObjectType, ByVal sModulName As String, _ Optional ByVal encode As Boolean = False) - + Dim strFileName As String strFileName = GetTempFileName Application.SaveAsText ObjType, sModulName, strFileName SaveAppFile sModulName, strFileName, True, encode - + Kill strFileName - + End Sub Public Function GetTempFileName(Optional ByVal TempPath As String = "", _ @@ -306,7 +306,7 @@ Public Function GetTempFileName(Optional ByVal TempPath As String = "", _ Dim strTempFileName As String Dim strTempPath As String Dim lngRet As Long - + If Len(TempPath) = 0 Then strTempFileName = String$(m_conMaxPathLen, 0) lngRet = GetTempPath(m_conMaxPathLen, strTempFileName) @@ -315,21 +315,21 @@ Public Function GetTempFileName(Optional ByVal TempPath As String = "", _ Else strTempPath = TempPath End If - + strTempFileName = String$(m_conMaxPathLen, 0) lngRet = API_GetTempFilename(strTempPath, FilePrefix, 0&, strTempFileName) - + strTempFileName = Left$(strTempFileName, InStr(strTempFileName, Chr$(0)) - 1) - + 'Delete file again, as only name is needed Call Kill(strTempFileName) - + If Len(FileExtension) > 0 Then strTempFileName = Left$(strTempFileName, Len(strTempFileName) - 3) & FileExtension End If - + GetTempFileName = strTempFileName - + End Function Private Sub CodeDecodeByteArray(ByRef TextByteArray() As Byte, ByVal Password As String) @@ -339,7 +339,7 @@ Private Sub CodeDecodeByteArray(ByRef TextByteArray() As Byte, ByVal Password As Dim lSize As Long Dim lenPwd As Long Dim i As Long - + lSize = UBound(TextByteArray) lenPwd = Len(Password) @@ -349,5 +349,5 @@ Private Sub CodeDecodeByteArray(ByRef TextByteArray() As Byte, ByVal Password As Key = Asc(Mid$(Password, lPos, 1)) TextByteArray(i) = (TextByteArray(i) Xor Key) Next i - + End Sub diff --git a/source/codelib/base/modApplication.bas b/source/modules/modApplication.bas similarity index 97% rename from source/codelib/base/modApplication.bas rename to source/modules/modApplication.bas index c8a3e42..1cb71d9 100644 --- a/source/codelib/base/modApplication.bas +++ b/source/modules/modApplication.bas @@ -1,5 +1,5 @@ -Attribute VB_Name = "modApplication" -Attribute VB_Description = "Standard-Prozeduren für die Arbeit mit ApplicationHandler" +Attribute VB_Name = "modApplication" +Attribute VB_Description = "Standard-Prozeduren für die Arbeit mit ApplicationHandler" '--------------------------------------------------------------------------------------- ' Package: base.modApplication '--------------------------------------------------------------------------------------- @@ -121,13 +121,13 @@ Public Sub DisposeCurrentApplicationHandler() Dim CheckCnt As Long, MaxCnt As Long On Error Resume Next - + If Not m_ApplicationHandler Is Nothing Then m_ApplicationHandler.Dispose End If - + Set m_ApplicationHandler = Nothing - + End Sub diff --git a/source/modColors.bas b/source/modules/modColors.bas similarity index 94% rename from source/modColors.bas rename to source/modules/modColors.bas index e7a151a..f4cf8a1 100644 --- a/source/modColors.bas +++ b/source/modules/modColors.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modColors" +Attribute VB_Name = "modColors" Option Compare Text Option Explicit Option Private Module @@ -9,72 +9,72 @@ Private Const m_Ac07_BackgroundDarkHeader As Long = -2147483611 Private Const m_Ac07_BordersGridlines As Long = -2147483609 Public Property Get dcwBackgroundForm() As Long - + If CurrentAccessVersion >= 12 Then dcwBackgroundForm = m_Ac07_BackgroundForm Else dcwBackgroundForm = VBA.SystemColorConstants.vbButtonFace End If - + End Property Public Property Get dcwBackgroundTextboxEdit() As Long - + dcwBackgroundTextboxEdit = VBA.SystemColorConstants.vbWindowBackground End Property ' Public Property Get dcwBackgroundLightHeader() As Long - + If CurrentAccessVersion >= 12 Then dcwBackgroundLightHeader = m_Ac07_BackgroundLightHeader Else dcwBackgroundLightHeader = VBA.SystemColorConstants.vbButtonFace End If - + End Property Public Property Get dcwBackgroundDarkHeader() As Long - + If CurrentAccessVersion >= 12 Then dcwBackgroundDarkHeader = m_Ac07_BackgroundDarkHeader Else dcwBackgroundDarkHeader = VBA.SystemColorConstants.vbButtonFace End If - + End Property Public Property Get dcwInfoLabelBackColor() As Long - + If CurrentAccessVersion >= 12 Then dcwInfoLabelBackColor = m_Ac07_BackgroundLightHeader Else dcwInfoLabelBackColor = &HE6E6E6 End If - + End Property Public Property Get dcwControlBorderColor() As Long - + If CurrentAccessVersion >= 12 Then dcwControlBorderColor = m_Ac07_BordersGridlines Else dcwControlBorderColor = 8421504 End If - + End Property -' Farben für Vorlagen-Anzeige +' Farben für Vorlagen-Anzeige Public Property Get dcwBackgroundFormTemplates() As Long - + dcwBackgroundFormTemplates = &HEDEDF9 End Property Public Property Get dcwBackgroundLightHeaderTemplates() As Long - + dcwBackgroundLightHeaderTemplates = &HEDEDF9 - + End Property diff --git a/source/codelib/data/modDbConnection.bas b/source/modules/modDbConnection.bas similarity index 94% rename from source/codelib/data/modDbConnection.bas rename to source/modules/modDbConnection.bas index 5daed59..32bd6ea 100644 --- a/source/codelib/data/modDbConnection.bas +++ b/source/modules/modDbConnection.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modDbConnection" +Attribute VB_Name = "modDbConnection" '--------------------------------------------------------------------------------------- ' Package: data.modDbConnection '--------------------------------------------------------------------------------------- @@ -102,7 +102,7 @@ End Property ' Function: CheckConnectionStatus '--------------------------------------------------------------------------------------- ' -' Verbindung prüfen (call ) +' Verbindung prüfen (call ) ' ' Return: ' Boolean - True if success @@ -132,7 +132,7 @@ On Error Resume Next m_DbConnectionManager.Dispose End If Set m_DbConnectionManager = Nothing - + End Sub '############################ @@ -152,15 +152,15 @@ End Sub '--------------------------------------------------------------------------------------- Public Function TableDefExists(ByVal TableDefName As String, _ Optional ByVal db As DAO.Database = Nothing) As Boolean -'Schneller wäre der Zugriff auf MSysObject (select .. from MSysObject where Name = 'Tabellenname' AND Type IN (1, 4, 6) -'Eine weitere Alternative wäre das Auswerten über cnn.OpenSchema(adSchemaTables, ...) ... dann werden allerdings keine verknüpften Tabellen geprüft - +'Schneller wäre der Zugriff auf MSysObject (select .. from MSysObject where Name = 'Tabellenname' AND Type IN (1, 4, 6) +'Eine weitere Alternative wäre das Auswerten über cnn.OpenSchema(adSchemaTables, ...) ... dann werden allerdings keine verknüpften Tabellen geprüft + Dim tdf As DAO.TableDef If db Is Nothing Then Set db = CurrentDb End If - + db.TableDefs.Refresh For Each tdf In db.TableDefs If tdf.Name = TableDefName Then @@ -184,13 +184,13 @@ End Function '--------------------------------------------------------------------------------------- Public Function QueryDefExists(ByVal QueryDefName As String, _ Optional ByVal db As DAO.Database = Nothing) As Boolean - + Dim qdf As DAO.QueryDef If db Is Nothing Then Set db = CurrentDb End If - + db.QueryDefs.Refresh For Each qdf In db.QueryDefs If qdf.Name = QueryDefName Then diff --git a/source/codelib/base/modErrorHandler.bas b/source/modules/modErrorHandler.bas similarity index 98% rename from source/codelib/base/modErrorHandler.bas rename to source/modules/modErrorHandler.bas index 326f2d4..895214d 100644 --- a/source/codelib/base/modErrorHandler.bas +++ b/source/modules/modErrorHandler.bas @@ -1,5 +1,5 @@ -Attribute VB_Name = "modErrorHandler" -Attribute VB_Description = "Prozeduren für die Fehlerbehandlung" +Attribute VB_Name = "modErrorHandler" +Attribute VB_Description = "Prozeduren für die Fehlerbehandlung" '--------------------------------------------------------------------------------------- ' Package: base.modErrorHandler '--------------------------------------------------------------------------------------- @@ -169,7 +169,7 @@ Public Function HandleError(ByVal ErrNumber As Long, ByVal ErrSource As String, If ErrHandlerMode = ACLibErrorHandlerMode.[_aclibErr_default] Then ErrHandlerMode = m_DefaultErrorHandlerMode End If - + HandleError = ProcHandleError(ErrNumber, ErrSource, ErrDescription, ErrHandlerMode) End Function @@ -182,23 +182,23 @@ Private Function ProcHandleError(ByRef ErrNumber As Long, ByRef ErrSource As Str Dim NewErrSource As String Dim NewErrDescription As String Dim CurrentErrSource As String - + NewErrDescription = Err.Description CurrentErrSource = Err.Source - + On Error Resume Next - + NewErrSource = ErrSource If Len(NewErrSource) = 0 Then NewErrSource = CurrentErrSource ElseIf CurrentErrSource <> GetApplicationVbProjectName Then NewErrSource = NewErrSource & ERRORSOURCE_DELIMITERSYMBOL & CurrentErrSource End If - + If Len(ErrDescription) > 0 Then NewErrDescription = ErrDescription End If - + 'Output to file If (ErrHandlerMode And ACLibErrorHandlerMode.aclibErrFile) Then PrintToFile ErrNumber, NewErrSource, NewErrDescription @@ -225,22 +225,22 @@ On Error GoTo 0 End Function Public Sub ShowErrorMessage(ByVal ErrNumber As Long, ByRef ErrSource As String, ByRef ErrDescription As String) - + Dim ErrMsgBoxTitle As String Dim Pos As Long Dim TempString As String On Error Resume Next - + Const LineBreakPos As Long = 50 - + Pos = InStr(1, ErrSource, ERRORSOURCE_DELIMITERSYMBOL, vbBinaryCompare) If Pos > 1 Then ErrMsgBoxTitle = Left$(ErrSource, Pos - 1) Else ErrMsgBoxTitle = ErrSource End If - + If Len(ErrSource) > LineBreakPos Then Pos = InStr(LineBreakPos, ErrSource, ERRORSOURCE_DELIMITERSYMBOL) If Pos > 0 Then @@ -252,7 +252,7 @@ On Error Resume Next ErrSource = TempString & ErrSource End If End If - + VBA.MsgBox "Error " & ErrNumber & ": " & vbNewLine & ErrDescription & vbNewLine & vbNewLine & "(" & ErrSource & ")", _ vbCritical + vbSystemModal + vbMsgBoxSetForeground, ErrMsgBoxTitle @@ -260,16 +260,16 @@ End Sub Private Sub PrintToFile(ByRef ErrNumber As Long, ByRef ErrSource As String, _ ByRef ErrDescription As String) - + Dim FileSource As String Dim f As Long Dim WriteToFile As Boolean Dim PathToErrLogFile As String - + On Error Resume Next - + WriteToFile = True - + FileSource = "[" & ErrSource & "]" PathToErrLogFile = ErrorHandlerLogFile If Len(PathToErrLogFile) = 0 Then @@ -281,18 +281,18 @@ On Error Resume Next "yyyy-mm-tt hh:nn:ss "); FileSource; _ " Error "; CStr(ErrNumber); ": "; ErrDescription Close #f - + End Sub Private Function GetApplicationVbProjectName() As String - + Static VbProjectName As String - + Dim DbFile As String Dim vbp As Object - + On Error Resume Next - + If Len(VbProjectName) = 0 Then VbProjectName = Access.VBE.ActiveVBProject.Name DbFile = CurrentDb.Name @@ -306,5 +306,5 @@ On Error Resume Next End If End If GetApplicationVbProjectName = VbProjectName - + End Function diff --git a/source/codelib/api/winapi/modWinAPI.bas b/source/modules/modWinAPI.bas similarity index 92% rename from source/codelib/api/winapi/modWinAPI.bas rename to source/modules/modWinAPI.bas index 45a08fd..7149495 100644 --- a/source/codelib/api/winapi/modWinAPI.bas +++ b/source/modules/modWinAPI.bas @@ -1,14 +1,14 @@ -Attribute VB_Name = "modWinAPI" -Attribute VB_Description = "Gebräuchliche WinAPI-Funktionen" +Attribute VB_Name = "modWinAPI" +Attribute VB_Description = "Gebräuchliche WinAPI-Funktionen" '--------------------------------------------------------------------------------------- ' Module: modWinAPI '--------------------------------------------------------------------------------------- '/** ' -' Gebräuchliche WinAPI-Funktionen +' Gebräuchliche WinAPI-Funktionen ' ' -' Sammlung von API-Deklarationen, die oft benötigt werden +' Sammlung von API-Deklarationen, die oft benötigt werden ' '\ingroup WinAPI '**/ @@ -69,7 +69,7 @@ Public Declare PtrSafe Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ pDest As Any, _ pSource As Any, _ ByVal dwLength As Long) - + Private Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal Hwnd As Long, _ ByVal wMsg As Long, _ @@ -91,7 +91,7 @@ Private Declare PtrSafe Function ShellExecuteA Lib "shell32.dll" ( _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long - + Private Declare PtrSafe Function GetDesktopWindow Lib "user32" () As Long Private Declare PtrSafe Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" ( _ @@ -116,7 +116,7 @@ Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" ( _ pDest As Any, _ pSource As Any, _ ByVal dwLength As Long) - + Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" ( _ ByVal Hwnd As Long, _ ByVal wMsg As Long, _ @@ -138,7 +138,7 @@ Private Declare Function ShellExecuteA Lib "shell32.dll" ( _ ByVal lpParameters As String, _ ByVal lpDirectory As String, _ ByVal nShowCmd As Long) As Long - + Private Declare Function GetDesktopWindow Lib "user32" () As Long Private Declare Function GetSystemDirectory Lib "kernel32" Alias "GetSystemDirectoryA" ( _ @@ -165,13 +165,13 @@ Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) '--------------------------------------------------------------------------------------- '--------------------------------------------------------------------------------------- -' Function: ShellExecuteOpenFile (Josef Pötzl, 2010-04-19) +' Function: ShellExecuteOpenFile (Josef Pötzl, 2010-04-19) '--------------------------------------------------------------------------------------- '/** ' -' Datei mit ShellExecute öffnen +' Datei mit ShellExecute öffnen ' -' vollständiger Dateiname inkl. Verzeichnis +' vollständiger Dateiname inkl. Verzeichnis ' "open", "print", ... ' Boolean ' @@ -184,7 +184,7 @@ Public Function ShellExecuteOpenFile(ByVal sFile As String, _ Dim lRet As Long Dim sDirectory As String Dim lngDeskWin As Long - + If sFile = vbNullString Then ShellExecuteOpenFile = False Exit Function @@ -192,7 +192,7 @@ Public Function ShellExecuteOpenFile(ByVal sFile As String, _ lngDeskWin = GetDesktopWindow() lRet = ShellExecuteA(lngDeskWin, sAPIOperation, sFile, vbNullString, vbNullString, vbNormalFocus) End If - + If lRet = SE_ERR_NOTFOUND Then 'Datei nicht gefunden MsgBox "Datei nicht gefunden" & vbNewLine & vbNewLine & _ @@ -201,14 +201,14 @@ Public Function ShellExecuteOpenFile(ByVal sFile As String, _ Exit Function ElseIf lRet = SE_ERR_NOASSOC Then 'Wenn die Dateierweiterung noch nicht bekannt ist... - 'wird der "Öffnen mit..."-Dialog angezeigt. + 'wird der "Öffnen mit..."-Dialog angezeigt. sDirectory = Space$(260) lRet = GetSystemDirectory(sDirectory, Len(sDirectory)) sDirectory = Left$(sDirectory, lRet) Call ShellExecuteA(lngDeskWin, vbNullString, "RUNDLL32.EXE", "shell32.dll, OpenAs_RunDLL " & _ sFile, sDirectory, vbNormalFocus) End If - + ShellExecuteOpenFile = True End Function @@ -220,7 +220,7 @@ End Function ' ' Email mit Standard-Programm versenden ' -' Empfänger-Adresse +' Empfänger-Adresse ' Betreff-Zeile ' Email-Text ' Boolean @@ -234,12 +234,12 @@ Public Function ShellExecuteSendMail(ByVal sTo As String, _ Dim lRet As Long Dim strLpFile As String - + If Len(sTo) = 0 Then ShellExecuteSendMail = False Exit Function End If - + If sSubject > vbNullString Then strLpFile = "subject=" & sSubject End If @@ -256,33 +256,33 @@ Public Function ShellExecuteSendMail(ByVal sTo As String, _ strLpFile = "mailto:" & sTo End If - - + + lRet = ShellExecuteA(GetDesktopWindow(), "open", strLpFile, vbNullString, vbNullString, vbNormalFocus) ShellExecuteSendMail = (lRet <> 0) End Function '--------------------------------------------------------------------------------------- -' Function: LaunchAppSynchronous (Josef Pötzl, 2010-04-19) +' Function: LaunchAppSynchronous (Josef Pötzl, 2010-04-19) '--------------------------------------------------------------------------------------- '/** ' -' Anwnedung Synchron ausführen +' Anwnedung Synchron ausführen ' -' Ausführbare Datei +' Ausführbare Datei ' Startparameter der Anwendung ' Fenstermodus ' Boolean ' -' Code hält so lange an, bis die gestartete Anwendung beendet wurde. +' Code hält so lange an, bis die gestartete Anwendung beendet wurde. ' '**/ '--------------------------------------------------------------------------------------- Public Function LaunchAppSynchronous(ByVal strExecutablePathAndName As String, _ Optional ByVal sParam As String = vbNullString, _ Optional ByVal lShowCommand As Long = vbNormalFocus) As Boolean - + 'http://planetsourcecode.com/vb/scripts/ShowCode.asp?txtCodeId=3716&lngWId=1 Dim lngResponse As Long @@ -322,7 +322,7 @@ Private Sub WaitForTermination(ByRef typProcessInfo As PROCESS_INFORMATION) 'to be processed while waiting for the p ' rocess to 'complete. - + Dim lngResponse As Long 'Let the process initialize Call WaitForInputIdle(typProcessInfo.hProcess, INFINITE) @@ -346,31 +346,31 @@ Private Sub WaitForTermination(ByRef typProcessInfo As PROCESS_INFORMATION) End Sub '--------------------------------------------------------------------------------------- -' Sub: SetFormIconFromFile (Josef Pötzl, 2009-12-19) +' Sub: SetFormIconFromFile (Josef Pötzl, 2009-12-19) '--------------------------------------------------------------------------------------- '/** ' -' Spezielles Icon für ein Formular einstellen +' Spezielles Icon für ein Formular einstellen ' ' Referenz zum Access.Form -' Icon-Datei (vollständige Pfadangabe) +' Icon-Datei (vollständige Pfadangabe) ' ' ' '**/ '--------------------------------------------------------------------------------------- Public Sub SetFormIconFromFile(ByRef FormRef As Access.Form, ByVal IconFilePath As String) - -On Error Resume Next ' ... Fehlermeldung würde bei dieser "unwichtigen" Funktion nur stören - + +On Error Resume Next ' ... Fehlermeldung würde bei dieser "unwichtigen" Funktion nur stören + Const ICONPIXELSIZE As Long = 16 - + Dim imageHandle As Long - + imageHandle = LoadImage(0, IconFilePath, IMAGE_ICON, _ ICONPIXELSIZE, ICONPIXELSIZE, LR_LOADFROMFILE) If imageHandle <> 0 Then SendMessage FormRef.Hwnd, WM_MSG_SETICON, WM_PARAM_ICON_SMALL, ByVal imageHandle End If - + End Sub diff --git a/source/modWinAPI_FileInfo.bas b/source/modules/modWinAPI_FileInfo.bas similarity index 96% rename from source/modWinAPI_FileInfo.bas rename to source/modules/modWinAPI_FileInfo.bas index 05dee52..920b2b0 100644 --- a/source/modWinAPI_FileInfo.bas +++ b/source/modules/modWinAPI_FileInfo.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modWinAPI_FileInfo" +Attribute VB_Name = "modWinAPI_FileInfo" Option Compare Text Option Explicit Option Private Module @@ -27,7 +27,7 @@ Private Declare PtrSafe Function GetFileVersionInfo _ ) _ As Long - + Private Declare PtrSafe Function VerQueryValue _ Lib "version.dll" _ Alias "VerQueryValueA" _ @@ -82,38 +82,38 @@ Private Function GetVersion(ByVal sPath As String, _ GetVersion = False Exit Function End If - + ReDim sBuffer(lSize) lRet = GetFileVersionInfo(sPath, 0&, lSize, sBuffer(0)) If lSize = 0 Then GetVersion = False Exit Function End If - + lRet = VerQueryValue(sBuffer(0), "\", lVerPointer, lVerBufLen) If lSize = 0 Then GetVersion = False Exit Function End If - + Call MoveMemory(FileInfo, lVerPointer, Len(FileInfo)) - + With FileInfo - + FInfo.FileVersion = _ Trim$(Str$((.dwFileVersionMS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwFileVersionMS And &HFFFF&)) & "." & _ Trim$(Str$((.dwFileVersionLS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwFileVersionLS And &HFFFF&)) - + FInfo.ProductVersion = _ Trim$(Str$((.dwProductVersionMS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwProductVersionMS And &HFFFF&)) & "." & _ Trim$(Str$((.dwProductVersionLS And &HFFFF0000) \ &H10000)) & "." & _ Trim$(Str$(.dwProductVersionLS And &HFFFF&)) - + End With - + GetVersion = True End Function @@ -121,10 +121,10 @@ End Function '##################################################### ' -' Ergänzung: +' Ergänzung: ' Public Function GetFileVersion(ByVal sFile As String) As String - + Dim VerInfo As FILEINFOOUT If GetVersion(sFile, VerInfo) Then diff --git a/source/codelib/api/winapi/modWinAPI_Mouse.bas b/source/modules/modWinApi_Mouse.bas similarity index 97% rename from source/codelib/api/winapi/modWinAPI_Mouse.bas rename to source/modules/modWinApi_Mouse.bas index 6feae17..fe91893 100644 --- a/source/codelib/api/winapi/modWinAPI_Mouse.bas +++ b/source/modules/modWinApi_Mouse.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modWinApi_Mouse" +Attribute VB_Name = "modWinApi_Mouse" '--------------------------------------------------------------------------------------- ' Package: api.winapi.modWinApi_Mouse '--------------------------------------------------------------------------------------- @@ -55,10 +55,10 @@ End Enum ' '--------------------------------------------------------------------------------------- Public Sub MouseCursor(ByVal CursorType As IDC_MouseCursor) - + Dim CursorPtr As LongPtr - + CursorPtr = LoadCursorBynum(0&, CursorType) SetCursor CursorPtr - + End Sub diff --git a/source/codelib/_codelib/addins/shared/modWizardCodeModulesData.bas b/source/modules/modWizardCodeModulesData.bas similarity index 95% rename from source/codelib/_codelib/addins/shared/modWizardCodeModulesData.bas rename to source/modules/modWizardCodeModulesData.bas index f323e7e..c325f38 100644 --- a/source/codelib/_codelib/addins/shared/modWizardCodeModulesData.bas +++ b/source/modules/modWizardCodeModulesData.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modWizardCodeModulesData" +Attribute VB_Name = "modWizardCodeModulesData" '--------------------------------------------------------------------------------------- ' Package: _codelib.addins.shared.modWizardCodeModulesData '--------------------------------------------------------------------------------------- @@ -22,23 +22,23 @@ Option Explicit Option Private Module Public Property Get SccRev() As String - + With CodeDb.OpenRecordset("select max(SccRev) from usys_AppFiles") If Not .EOF Then SccRev = Nz(.Fields(0).Value, 0) End If .Close End With - + End Property Public Property Get SccRevMin() As String - + With CodeDb.OpenRecordset("select Min(SccRev) from usys_AppFiles") If Not .EOF Then SccRevMin = Nz(.Fields(0).Value, "0") End If .Close End With - + End Property diff --git a/source/modWizardTools.bas b/source/modules/modWizardTools.bas similarity index 90% rename from source/modWizardTools.bas rename to source/modules/modWizardTools.bas index 44f8b84..581b518 100644 --- a/source/modWizardTools.bas +++ b/source/modules/modWizardTools.bas @@ -1,4 +1,4 @@ -Attribute VB_Name = "modWizardTools" +Attribute VB_Name = "modWizardTools" Option Compare Database Option Explicit @@ -6,7 +6,7 @@ Public Function CheckApplicationStartUpMethod() If CurrentDb.Name Like "*.accda" Then MsgBox "The add-in must be installed into the Access add-in directory using the add-in manager. Afterwards it has to be started via the menu entry '" & APPLICATION_NAME & "'.", _ vbExclamation, APPLICATION_NAME & ": Incorrect start" - + Application.Quit End If End Function diff --git a/source/nav-pane-groups.json b/source/nav-pane-groups.json new file mode 100644 index 0000000..5dff1ef --- /dev/null +++ b/source/nav-pane-groups.json @@ -0,0 +1,24 @@ +{ + "Info": { + "Class": "clsDbNavPaneGroup", + "Description": "Navigation Pane Custom Groups" + }, + "Items": { + "Categories": [ + { + "Name": "Benutzerdefiniert", + "Flags": 0, + "Position": 2, + "Groups": [ + { + "Name": "Benutzerdefinierte Gruppe 1", + "Flags": 0, + "Position": 2, + "Objects": [ + ] + } + ] + } + ] + } +} diff --git a/source/proj-properties.json b/source/proj-properties.json new file mode 100644 index 0000000..a113700 --- /dev/null +++ b/source/proj-properties.json @@ -0,0 +1,9 @@ +{ + "Info": { + "Class": "clsDbProjProperty", + "Description": "Project Properties (Access)" + }, + "Items": { + "VCS Source Path": "\\source" + } +} diff --git a/source/project.json b/source/project.json new file mode 100644 index 0000000..00e38af --- /dev/null +++ b/source/project.json @@ -0,0 +1,10 @@ +{ + "Info": { + "Class": "clsDbProject", + "Description": "Project" + }, + "Items": { + "FileFormat": 12, + "RemovePersonalInformation": false + } +} diff --git a/source/queries/usys_DbmsTableNames.json b/source/queries/usys_DbmsTableNames.json new file mode 100644 index 0000000..8d1c037 --- /dev/null +++ b/source/queries/usys_DbmsTableNames.json @@ -0,0 +1,46 @@ +{ + "Info": { + "Class": "clsDbQuery", + "Description": "usys_DbmsTableNames" + }, + "Items": { + "QueryType": 112, + "Connect": "ODBC;", + "QueryProperties": { + "Description": { + "Type": 10, + "Value": "Auflistung der TAbellen und Sichten zum aktiven DBMS (wird in frmConfig_LinkTables verwendet)" + }, + "LogMessages": { + "Type": 1, + "Value": false + } + }, + "DesignLayout": { + "State": 0, + "Window": { + "left": 0, + "top": 40, + "right": 1331, + "bottom": 851 + }, + "DesignerPane": { + "left": -1, + "top": -1, + "right": 1299, + "bottom": 477 + }, + "GridLeft": 0, + "GridTop": 0, + "ColumnsShown": 2058, + "Tables": [ + ] + }, + "Properties": { + "Description": { + "Type": 10, + "Value": "Auflistung der TAbellen und Sichten zum aktiven DBMS (wird in frmConfig_LinkTables verwendet)" + } + } + } +} diff --git a/source/queries/usys_DbmsTableNames.sql b/source/queries/usys_DbmsTableNames.sql new file mode 100644 index 0000000..a14e3a6 --- /dev/null +++ b/source/queries/usys_DbmsTableNames.sql @@ -0,0 +1 @@ +select 1 as X diff --git a/source/relations/MSysAccessStorageSTGREL.json b/source/relations/MSysAccessStorageSTGREL.json new file mode 100644 index 0000000..aac712e --- /dev/null +++ b/source/relations/MSysAccessStorageSTGREL.json @@ -0,0 +1,18 @@ +{ + "Info": { + "Class": "clsDbRelation", + "Description": "Database relationship" + }, + "Items": { + "Name": "MSysAccessStorageSTGREL", + "Attributes": 4096, + "Table": "MSysAccessStorage", + "ForeignTable": "MSysAccessStorage", + "Fields": [ + { + "Name": "Id", + "ForeignName": "ParentId" + } + ] + } +} diff --git a/source/tables/L10n_Dict.xml b/source/tables/L10n_Dict.xml new file mode 100644 index 0000000..461f246 --- /dev/null +++ b/source/tables/L10n_Dict.xml @@ -0,0 +1,820 @@ + + + + DE + &Check Connection + &Verbindung testen + + + DE + &Link table(s) + Tabelle(n) &verknüpfen + + + DE + &New Connection + &Neue Verbindung + + + DE + &Remove linked tables + Verknüpfte Tabellen &löschen + + + DE + &Update existing linked tables + Vorhandene verknüpfte Tabellen &aktualisieren + + + DE + @;" <Enter identifier here>" + @;" <Hier Kennung eingeben>" + + + DE + @;"Only fill in if ConnectionString is not to be generated by code." + @;"nur ausfüllen, wenn ConnectionString nicht per Code erzeugt werden soll" + + + DE + Additional information for the connection strings generated in the DbConnectionInfo class. +The entries are appended to the end of the generated connection strings. + Zusatzangaben für die in der DbConnectionInfo-Klasse erzeugten Connectionstrings. +Die Einträge werden am Ende der generierten Connectionstrings angehängt. + + + DE + all linked tables/queries + alle verknüpften Tabellen/Abfragen + + + DE + All modules are already up to date. +Do you still want to re-import? + Es sind bereits alle Module auf dem neuesten Stand. +Trotzdem neu einlesen? + + + DE + Appended after the ODBC connection string created by code. + Wird hinter dem per Code erstellten ODBC-Connectionstring angehängt + + + DE + Appended after the OLEDB connection string created by code. + Wird hinter dem per Code erstellten OLEDB-Connectionstring angehängt + + + DE + Apply &Filter + &Filter anwenden + + + DE + Check wizard version + Wizard-Version prüfen + + + DE + Classes & Modules + Klassen & Module + + + DE + Codemodules have been updated. + Codemodule wurden aktualisiert. + + + DE + Connection could not be established. + Verbindung konnte nicht hergestellt werden. + + + DE + Connection identifier (double click to edit) + Verbindungskennung (Doppelklick zum Bearbeiten) + + + DE + Connection was successful + Verbindungsaufbau war erfolgreich + + + DE + Create &new linked tables + &Neue verknüpfte Tabellen &erstellen + + + DE + custom + benutzerdefiniert + + + DE + Custom ConnectionString: + Benutzerdefinierter ConnectionString: + + + DE + Custom ODBC connection string (connection string is not created by code) + Benutzerdefinierter ODBC-Connectionstring (Connectionstring wird nicht per Code erstellt) + + + DE + Custom OLEDB connection string (connection string is not created by code) + Benutzerdefinierter OLEDB-Connectionstring (Connectionstring wird nicht per Code erstellt) + + + DE + Database name in the server; for JET: = complete path to the BE + Datenbank-Name im Server; bei JET: = vollständige Pfadangabe zum BE + + + DE + DBMS Connection Wizard: Configure DBMS Connection + DBMS-Connection-Wizard: DBMS-Verbindung konfigurieren + + + DE + DbmsConnectionWizard + DbmsConnectionWizard + + + DE + dsn less + ohne DSN ("dsn less") + + + DE + en&abled + &aktiviert + + + DE + Enter query name + Abfragenamen eingeben + + + DE + Filter list + Liste filtern + + + DE + Ignore all settings and set the connection string manually. + Alle Einstellungen ignorieren und den Connectionstring manuell festlegen. + + + DE + Install modules and classes: + Module u. Klassen installieren: + + + DE + last linked: + zuletzt verknüpft: + + + DE + last removed: + zuletzt entfernt: + + + DE + Latest version is installed + Aktuelle Version ist installiert + + + DE + Link tables + Tabellen verknüpfen + + + DE + linked tables were removed + verknüpfte Tabellen wurden entfernt + + + DE + Linking completed + Verknüpfen abgeschlossen + + + DE + Login name + Loginname + + + DE + Modules and classes updated + Module und Klassen wurden aktualisiert + + + DE + Name of the database user + Name des Datenbankbenutzers + + + DE + Name or IP address of the database server (for MSSQL incl. instance identifier) + Name oder IP-Adresse des Datenbankservers (bei MSSQL inkl. Instanzkennung) + + + DE + Other options: + Weitere Optionen: + + + DE + Password + Passwort + + + DE + Password of the user. As soon as a password is available, the tables incl. password are linked. If this is not desired, the login form should be used. + Kennwort der Benutzers. Sobald ein Kennwort verfügbar ist, werden die Tabellen inkl. Kennwort verknüpft. Falls das nicht erwünscht ist, sollte das Login-Formular verwendet werden. + + + DE + Please choose another name. + Bitte wählen Sie einen anderen Namen. + + + DE + Please enter a table name. + Bitte einen Tabellennamen angeben. + + + DE + Please enter login name and password + Bitte Loginnamen und Kennwort eingeben + + + DE + Please select the DBMS first! + Bitte zuerst das DBMS auswählen! + + + DE + Please specify SQL statement. + Bitte SQL-Anweisung angeben. + + + DE + Remarks: + Anmerkungen: + + + DE + Renew all code modules (existing modules are overwritten) + Alle Codemodule erneuern (vorhandene Module werden überschrieben) + + + DE + Renew all code modules except 'defGlobal_DBMS' (defGlobal_DBMS remains unchanged) + Alle Codemodule außer 'defGlobal_DBMS' erneuern (defGlobal_DBMS bleibt unverändert) + + + DE + Select + Auswählen + + + DE + Select connection + Verbindung wählen + + + DE + Select database file + Datenbankdatei auswählen + + + DE + Select ODBC Driver + ODBC-Treiber auswählen + + + DE + Select OLEDB Provider + OLEDB-Provider auswählen + + + DE + Select table/view &manually + Tabelle/Sicht &manuell auswählen + + + DE + Should all linked tables be deleted? +(The tables are removed only in the frontend.) + Sollen alle verknüpften Tabellen gelöscht werden? +(Die Tabellen werden nur im Frontend entfernt.) + + + DE + Should the selected tables be deleted? +(The tables are removed only in the frontend.) + Sollen die ausgewählten Tabellen gelöscht werden? +(Die Tabellen werden nur im Frontend entfernt.) + + + DE + Should this be changed? + Soll diese geändert werden? + + + DE + Show tables from &database + Tabellen aus &Datenbank anzeigen + + + DE + SQL statement was executed. + SQL-Anweisung wurde ausgeführt. + + + DE + Statement is executed + Anweisung wird ausgeführt + + + DE + Tables/queries were linked + Tabellen/Abfragen wurden verknüpft + + + DE + Test SQL statement + SQL-Anweisung testen + + + DE + The required table 'usys_DbmsConnection' does not exist, should it be created? + Die erforderliche Tabelle 'usys_DbmsConnection' existiert nicht, soll sie erstellt werden? + + + DE + There is already a query named '{0}'. + Es existiert bereits eine Abfrage mit dem Namen '{0}' + + + DE + There is already a table named '{0}'. + Es existiert bereits eine Tabelle mit dem Namen '{0}'. + + + DE + Type: + Typ: + + + DE + Under which name should the query be saved? + Unter welchem Namen soll die Abfrage gespeichert werden? + + + DE + Update code modules in add-in from SCC repository (draft). + Codemodule in Add-In aus SCC-Repository aktualisieren (draft). + + + DE + Update code modules in add-in from SCC repository (master). + Codemodule in Add-In aus SCC-Repository aktualisieren (master). + + + DE + Update linked tables + Verknüpften Tabellen aktualisieren + + + DE + use DSN + mit DSN + + + DE + Use Login Form: + Login-Formular verwenden: + + + DE + Use saved DSN (only works for ODBC connection) + Gespeicherte DSN verwenden (wirkt nur für ODBC-Verbindung) + + + DE + Windows Authentification: + Windows-Authentifizierung: + + + EN + &Check Connection + &Check Connection + + + EN + &Link table(s) + &Link table(s) + + + EN + &New Connection + &New Connection + + + EN + &Remove linked tables + &Remove linked tables + + + EN + &Update existing linked tables + &Update existing linked tables + + + EN + @;" <Enter identifier here>" + @;" <Enter identifier here>" + + + EN + @;"Only fill in if ConnectionString is not to be generated by code." + @;"Only fill in if ConnectionString is not to be generated by code." + + + EN + Additional information for the connection strings generated in the DbConnectionInfo class. +The entries are appended to the end of the generated connection strings. + Additional information for the connection strings generated in the DbConnectionInfo class. +The entries are appended to the end of the generated connection strings. + + + EN + all linked tables/queries + all linked tables/queries + + + EN + All modules are already up to date. +Do you still want to re-import? + Es sind bereits alle Module auf dem neuesten Stand. +Trotzdem neu einlesen? + + + EN + Appended after the ODBC connection string created by code. + Appended after the ODBC connection string created by code. + + + EN + Appended after the OLEDB connection string created by code. + Appended after the OLEDB connection string created by code. + + + EN + Apply &Filter + Apply &Filter + + + EN + Check wizard version + Check wizard version + + + EN + Classes & Modules + Classes & Modules + + + EN + Codemodules have been updated. + Code modules have been updated. + + + EN + Connection could not be established. + Connection could not be established. + + + EN + Connection identifier (double click to edit) + Connection identifier (double click to edit) + + + EN + Connection was successful + Connection was successful + + + EN + Create &new linked tables + Create &new linked tables + + + EN + custom + custom + + + EN + Custom ConnectionString: + Custom ConnectionString: + + + EN + Custom ODBC connection string (connection string is not created by code) + Custom ODBC connection string (connection string is not created by code) + + + EN + Custom OLEDB connection string (connection string is not created by code) + User-defined OLEDB connection string (connection string is not created by code) + + + EN + Database name in the server; for JET: = complete path to the BE + Database name in the server; for JET: = complete path to the BE + + + EN + DBMS Connection Wizard: Configure DBMS Connection + DBMS Connection Wizard: Configure DBMS Connection + + + EN + DbmsConnectionWizard + DbmsConnectionWizard + + + EN + dsn less + dsn less + + + EN + en&abled + en&abled + + + EN + Enter query name + Enter query name + + + EN + Filter list + Filter list + + + EN + Ignore all settings and set the connection string manually. + Ignore all settings and set the connection string manually. + + + EN + Install modules and classes: + Install modules and classes: + + + EN + last linked: + last linked: + + + EN + last removed: + last removed: + + + EN + Latest version is installed + Latest version is installed + + + EN + Link tables + Link tables + + + EN + linked tables were removed + linked tables were removed + + + EN + Linking completed + Linking +completed + + + EN + Login name + Login name + + + EN + Modules and classes updated + Modules and classes updated + + + EN + Name of the database user + Name of the database user + + + EN + Name or IP address of the database server (for MSSQL incl. instance identifier) + Name or IP address of the database server (for MSSQL incl. instance identifier) + + + EN + Other options: + Other options: + + + EN + Password + Password + + + EN + Password of the user. As soon as a password is available, the tables incl. password are linked. If this is not desired, the login form should be used. + Password of the user. As soon as a password is available, the tables incl. password are linked. If this is not desired, the login form should be used. + + + EN + Please choose another name. + Please choose another name. + + + EN + Please enter a table name. + Please enter a table name. + + + EN + Please enter login name and password + Please enter login name and password + + + EN + Please select the DBMS first! + Please select the DBMS first! + + + EN + Please specify SQL statement. + Please specify SQL statement. + + + EN + Remarks: + Remarks: + + + EN + Renew all code modules (existing modules are overwritten) + Renew all code modules (existing modules are overwritten) + + + EN + Renew all code modules except 'defGlobal_DBMS' (defGlobal_DBMS remains unchanged) + Renew all code modules except 'defGlobal_DBMS' (defGlobal_DBMS remains unchanged) + + + EN + Select + Select + + + EN + Select connection + Select connection + + + EN + Select database file + Select database file + + + EN + Select ODBC Driver + Select ODBC Driver + + + EN + Select OLEDB Provider + Select OLEDB Provider + + + EN + Select table/view &manually + Select table/view &manually + + + EN + Should all linked tables be deleted? +(The tables are removed only in the frontend.) + Should all linked tables be deleted? +(The tables are removed only in the frontend.) + + + EN + Should the selected tables be deleted? +(The tables are removed only in the frontend.) + Should the selected tables be deleted? +(The tables are removed only in the frontend.) + + + EN + Should this be changed? + Should this be changed? + + + EN + Show tables from &database + Show tables from &database + + + EN + SQL statement was executed. + SQL statement was executed. + + + EN + Statement is executed + Statement is executed + + + EN + Tables/queries were linked + Tables/queries were linked + + + EN + Test SQL statement + Test SQL statement + + + EN + The required table 'usys_DbmsConnection' does not exist, should it be created? + The required table 'usys_DbmsConnection' does not exist, should it be created? + + + EN + There is already a query named '{0}'. + There is already a query named '{0}'. + + + EN + There is already a table named '{0}'. + There is already a table named '{0}'. + + + EN + Type: + Type: + + + EN + Under which name should the query be saved? + Under which name should the query be saved? + + + EN + Update code modules in add-in from SCC repository (draft). + Update code modules in add-in from SCC repository (draft). + + + EN + Update code modules in add-in from SCC repository (master). + Update code modules in add-in from SCC repository (master). + + + EN + Update linked tables + Update linked tables + + + EN + use DSN + use DSN + + + EN + Use Login Form: + Use Login Form: + + + EN + Use saved DSN (only works for ODBC connection) + Use saved DSN (only works for ODBC connection) + + + EN + Windows Authentification: + Windows Authentification: + + diff --git a/source/tables/USysRegInfo.txt b/source/tables/USysRegInfo.txt new file mode 100644 index 0000000..8075178 --- /dev/null +++ b/source/tables/USysRegInfo.txt @@ -0,0 +1,34 @@ +Subkey Type ValName Value +HKEY_CURRENT_ACCESS_PROFILE\\Menu Add-Ins\\DBMS-Connection-Wizard 0 +HKEY_CURRENT_ACCESS_PROFILE\\Menu Add-Ins\\DBMS-Connection-Wizard 1 Expression =StartDbmsConnectionWizard() +HKEY_CURRENT_ACCESS_PROFILE\\Menu Add-Ins\\DBMS-Connection-Wizard 1 Library |ACCDIR\\DbmsConnectionWizard.accda +HKEY_CURRENT_ACCESS_PROFILE\\Menu Add-Ins\\DBMS-Connection-Wizard 4 BitmapID 339 +HKEY_CURRENT_ACCESS_PROFILE\\Menu Add-Ins\\DBMS-Connection-Wizard 4 Version 1 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 0 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 1 Description ODBC-Verbindungszeichenfolge mittels DBMS-Connection-Wizard einfügen +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 1 Feature DeveloperWizards +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 1 Function InsertOdbcConnectionString +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 1 Library |ACCDIR\\DbmsConnectionWizard.accda +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 4 Can Edit 1 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Property Wizards\\ODBCConnectStr\\DBMS Connectionstring 4 Version 1 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 0 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 1 Description Tabellen mittels DBMS-Connection-Wizard verknüpfen +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 1 Feature DeveloperWizards +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 1 Function StartDbmsConnectionLinkTableWizard +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 1 Library |ACCDIR\\DbmsConnectionWizard.accda +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 4 BitmapID 339 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\DBMS-Tabellen verknüpfen 4 Version 1 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 0 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 1 Description Pass-Through-Abfrage mittels DBMS-Connection-Wizard erstellen +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 1 Feature DeveloperWizards +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 1 Function CreatePassThroughQuery +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 1 Library |ACCDIR\\DbmsConnectionWizard.accda +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 4 BitmapID 325 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Query Wizards\\Pass-Through-Abfrage erstellen 4 Version 1 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 0 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 1 Description Tabellen mittels DBMS-Connection-Wizard verknüpfen +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 1 Feature DeveloperWizards +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 1 Function StartDbmsConnectionLinkTableWizard +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 1 Library |ACCDIR\\DbmsConnectionWizard.accda +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 4 BitmapID 339 +HKEY_CURRENT_ACCESS_PROFILE\\Wizards\\Table Wizards\\DBMS-Tabellen verknüpfen 4 Version 1 diff --git a/source/tables/usys_AppFiles.xml b/source/tables/usys_AppFiles.xml new file mode 100644 index 0000000..b55e1cd --- /dev/null +++ b/source/tables/usys_AppFiles.xml @@ -0,0 +1,11929 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + AdodbHandler + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIkFkb2RiSGFuZGxlciINCkF0dHJp +YnV0ZSBWQl9HbG9iYWxOYW1lU3BhY2UgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX0Ny +ZWF0YWJsZSA9IEZhbHNlDQpBdHRyaWJ1dGUgVkJfUHJlZGVjbGFyZWRJZCA9IFRy +dWUNCkF0dHJpYnV0ZSBWQl9FeHBvc2VkID0gRmFsc2UNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgQ2xhc3M6IGRhdGEuYWRvZGIu +QWRvZGJIYW5kbGVyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonDQonIEFET0RCIGRhdGEgY29ubmVjdGlvbiBtZXRob2RzDQonDQon +IEF1dGhvcjoNCicgICAgIEpvc2VmIFBvZXR6bA0KJw0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonPGNvZGVsaWI+DQonICA8ZmlsZT5kYXRh +L2Fkby9BZG9kYkhhbmRsZXIuY2xzPC9maWxlPg0KJyAgPGxpY2Vuc2U+X2NvZGVs +aWIvbGljZW5zZS5iYXM8L2xpY2Vuc2U+DQonICA8cmVmPjxuYW1lPkFET0RCPC9u +YW1lPjxtYWpvcj4yPC9tYWpvcj48bWlub3I+MTwvbWlub3I+PGd1aWQ+ezAwMDAw +MjAxLTAwMDAtMDAxMC04MDAwLTAwQUEwMDZEMkVBNH08L2d1aWQ+PC9yZWY+DQon +ICA8dGVzdD5fdGVzdC9kYXRhL2Fkby9BZG9kYkhhbmRsZXJUZXN0cy5jbHM8L3Rl +c3Q+DQonPC9jb2RlbGliPg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJw0KT3B0aW9uIENvbXBhcmUgVGV4dA0KT3B0aW9uIEV4cGxp +Y2l0DQoNCidBRE9EQi1Db25uZWN0aW9uDQpQcml2YXRlIG1fQWRvQ29ubmVjdGlv +biBBcyBBRE9EQi5Db25uZWN0aW9uDQoNCidBRE8tQ29ubmVjdGlvbnN0cmluZw0K +UHJpdmF0ZSBtX0Fkb0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nDQoNCicjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjDQonIEdyb3VwOiBFdmVudHMNCg0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBFdmVudDogRXJyb3JNaXNzaW5nQ3Vy +cmVudENvbm5lY3Rpb24NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicNCicgRXZlbnQgZm9yIG1pc3NpbmcgQURPREIgY29ubmVjdGlv +biByZWZlcmVuY2UNCicgKFBhc3NpbmcgdGhlIEFkb2RiSGFuZGxlciBldmVudDog +PGRhdGEuYWRvZGIuQWRvZGJIYW5kbGVyOjpFcnJvck1pc3NpbmdDdXJyZW50Q29u +bmVjdGlvbj4pDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBNc2cgICAtICBNZXNz +YWdlIGFib3V0IHRoZSBjYXVzZSBvZiB0aGUgZXZlbnQgdHJpZ2dlcmluZy4gKE5v +dCB5ZXQgdXNlZCkNCicgICAgIE5ld0N1cnJlbnRDb25uZWN0aW9uIC0gQURPREIu +Q29ubmVjdGlvbnJlZmVyZW5jZSB0byBiZSB1c2VkIGZvciBDdXJyZW50Q29ubmVj +dGlvbg0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIGFwcHJvcHJpYXRlIEFET0RC +LkRhdGFiYXNlIHJlZmVyZW5jZSBjYW4gYmUgcGFzc2VkIG9uIHZpYSB0aGUgQnlS +ZWYgcGFyYW1ldGVyIE5ld0N1cnJlbnRDb25uZWN0aW9uLg0KJyAgICAgSG93ZXZl +ciwgcGFzc2luZyBvbiBhIHJlZmVyZW5jZSBpcyBub3QgbWFuZGF0b3J5LCBzaW5j +ZSwgaXQgaXMgc3RvcmVkIGluIHRoZSBBZG9kYkhhbmRsZXIgcHJvcGVydHkgPGRh +dGEuYWRvZGIuQWRvZGJIYW5kbGVyOjpDdXJyZW50Q29ubmVjdGlvbj4uDQonICAg +ICBUaGUgY29ubmVjdGlvbiBpcyB0aGVuIGNyZWF0ZWQgZnJvbSB0aGUgPGRhdGEu +YWRvZGIuQWRvZGJIYW5kbGVyOjpDb25uZWN0aW9uU3RyaW5nPg0KJw0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50 +IEVycm9yTWlzc2luZ0N1cnJlbnRDb25uZWN0aW9uKEJ5VmFsIE1zZyBBcyBTdHJp +bmcsIEJ5UmVmIE5ld0N1cnJlbnRDb25uZWN0aW9uIEFzIEFET0RCLkNvbm5lY3Rp +b24pDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicgRXZlbnQ6IEVycm9yRW1wdHlPbGVkYkNvbm5lY3Rpb25TdHJpbmcNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRXZlbnQg +Zm9yIG1pc3NpbmcgT0xFREIgY29ubmVjdGlvbiBzdHJpbmcNCicNCicgUGFyYW1l +dGVyczoNCicgICAgIE1zZyAgICAgICAgICAgICAgICAgIC0gTWVzc2FnZSBhYm91 +dCB0aGUgY2F1c2Ugb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcuIChOb3QgeWV0IHVz +ZWQpDQonICAgICBOZXdDb25uZWN0aW9uU3RyaW5nICAtIE9MRURCIENvbm5lY3Rp +b25zdHJpbmcNCicNCicgUmVtYXJrczoNCicgICAgIFRoZSBhcHByb3ByaWF0ZSBP +TEVEQiBjb25uZWN0aW9uIHN0cmluZyBjYW4gYmUgcGFzc2VkIG9uIHZpYSB0aGUg +QnlSZWYgcGFyYW1ldGVyIE5ld0Nvbm5lY3Rpb25TdHJpbmcuDQonDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRXZlbnQg +RXJyb3JFbXB0eUNvbm5lY3Rpb25TdHJpbmcoQnlWYWwgTXNnIEFzIFN0cmluZywg +QnlSZWYgTmV3Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcpDQoNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRXZlbnQ6IEhvb2tJ +bnNlcnRJZGVudGl0eVJldHVybg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJw0KJyBFdmVudCBmb3IgbWlzc2luZyBPTEVEQiBjb25u +ZWN0aW9uIHN0cmluZw0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgSW5zZXJ0U3Fs +ICAgICAgICAgICAgLSBTUUwgdGV4dCBvZiBpbnNlcnQgc3RhdGVtZW50DQonICAg +ICBJZGVudGl0eVRhYmxlICAgICAgICAtIElkZW50aXR5IHRhYmxlDQonICAgICBB +Y3RpdmVDb25uZWN0aW9uICAgICAtIEFET0RCIENvbm5lY3Rpb24gdG8gdXNlDQon +ICAgICBJZGVudGl0eVNlbGVjdFN0cmluZyAtIElucHV0IHN0cmluZyB0byB1c2UN +CicgICAgIEhvb2tSZXNwb25zZU1vZGUgICAgICAgLSByZXN1bWUgYWN0aW9uIGFm +dGVyIGV2ZW50IGNhbGw6IDAgLi4uIGNvZGUgcmVzdW1lIGFmdGVyIGV2ZW50LCAx +IGV4aXQgZnVuY3Rpb24gYWZ0ZXIgZXZlbnQNCicgICAgIEhvb2tSZXNwb25zZU1l +c3NhZ2UgICAgLSByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gKGUuZy4gSW5zZXJ0 +SWRlbnRpdHlSZXR1cm4pIHdoZW4gSG9va1Jlc3VtZU1vZGUgPD4gMA0KJw0KJyBS +ZW1hcmtzOg0KJyAgICAgTmV3IHZhbHVlcyBjYW4gYmUgcGFzc2VkIG9uIHZpYSB0 +aGUgQnlSZWYgcGFyYW1ldGVycy4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBFdmVudCBIb29rSW5zZXJ0SWRlbnRp +dHlSZXR1cm4oQnlSZWYgSW5zZXJ0U1FMIEFzIFN0cmluZywgQnlSZWYgSWRlbnRp +dHlUYWJsZSBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgQnlSZWYgQWN0aXZlQ29ubmVjdGlvbiBBcyBBRE9EQi5Db25u +ZWN0aW9uLCBCeVJlZiBJZGVudGl0eVNlbGVjdFN0cmluZyBBcyBTdHJpbmcsIF8N +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlSZWYgSG9v +a1Jlc3BvbnNlTW9kZSBBcyBMb25nLCBCeVJlZiBIb29rUmVzcG9uc2VNZXNzYWdl +IEFzIFZhcmlhbnQpDQoNClByaXZhdGUgbV9Ib29rc0VuYWJsZWQgQXMgQm9vbGVh +bg0KDQpQcml2YXRlIG1fRGVmYXVsdEN1cnNvckxvY2F0aW9uIEFzIEFET0RCLkN1 +cnNvckxvY2F0aW9uRW51bQ0KDQonIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KJyBHcm91cDogQ2xh +c3MgY29udHJvbA0KDQonDQonIEluaXQgLyBUZXJtaW5hdGUNCicgLS0tLS0tLS0t +LS0tLS0tLQ0KUHJpdmF0ZSBTdWIgQ2xhc3NfSW5pdGlhbGl6ZSgpDQogICBtX0Rl +ZmF1bHRDdXJzb3JMb2NhdGlvbiA9IGFkVXNlU2VydmVyDQpFbmQgU3ViDQoNClBy +aXZhdGUgU3ViIENsYXNzX1Rlcm1pbmF0ZSgpDQogICBEaXNwb3NlDQpFbmQgU3Vi +DQoNClB1YmxpYyBTdWIgRGlzcG9zZSgpDQogICBTZXQgbV9BZG9Db25uZWN0aW9u +ID0gTm90aGluZw0KRW5kIFN1Yg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonIFByb3BlcnR5OiBIb29rc0VuYWJsZWQNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgQWN0aXZlIEhv +b2tzDQonDQonIFJlbWFya3M6DQonICAgICBVc2VkIGluIEluc2VydElkZW50aXR5 +UmV0dXJuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQpQdWJsaWMgUHJvcGVydHkgR2V0IEhvb2tzRW5hYmxlZCgpIEFzIEJvb2xl +YW4NCiAgIEhvb2tzRW5hYmxlZCA9IG1fSG9va3NFbmFibGVkDQpFbmQgUHJvcGVy +dHkNCg0KUHVibGljIFByb3BlcnR5IExldCBIb29rc0VuYWJsZWQoQnlWYWwgTmV3 +VmFsdWUgQXMgQm9vbGVhbikNCiAgIG1fSG9va3NFbmFibGVkID0gTmV3VmFsdWUN +CkVuZCBQcm9wZXJ0eQ0KDQpQdWJsaWMgUHJvcGVydHkgR2V0IERlZmF1bHRDdXJz +b3JMb2NhdGlvbigpIEFzIEFET0RCLkN1cnNvckxvY2F0aW9uRW51bQ0KICAgRGVm +YXVsdEN1cnNvckxvY2F0aW9uID0gbV9EZWZhdWx0Q3Vyc29yTG9jYXRpb24NCkVu +ZCBQcm9wZXJ0eQ0KDQpQdWJsaWMgUHJvcGVydHkgTGV0IERlZmF1bHRDdXJzb3JM +b2NhdGlvbihCeVZhbCBOZXdWYWx1ZSBBcyBBRE9EQi5DdXJzb3JMb2NhdGlvbkVu +dW0pDQogICBtX0RlZmF1bHRDdXJzb3JMb2NhdGlvbiA9IE5ld1ZhbHVlDQpFbmQg +UHJvcGVydHkNCg0KJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCicgR3JvdXA6IERhdGEgQ29ubmVj +dGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQonIFByb3BlcnR5OiBDdXJyZW50Q29ubmVjdGlvbg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBHZXQ6DQonICAgICBDdXJy +ZW50bHkgc2V0IEFET0RCIGNvbm5lY3Rpb24NCicNCicgU2V0Og0KJyAgICAgU2V0 +IG5ldyBBRE9EQiBjb25uZWN0aW9uDQonDQonIFJlbWFya3M6DQonICAgICBJZiB0 +aGVyZSBpcyBubyBBRE9EQiBjb25uZWN0aW9uIHlldCwgYSBuZXcgQURPREIgY29u +bmVjdGlvbiB3aWxsIGJlIGNyZWF0ZWQuDQonICAgICBJbnN0YW50aWF0aW9uIGZs +b3c6DQonICAgICAgICAxLiByYWlzZUV2ZW50ICNFcnJvck1pc3NpbmdDdXJyZW50 +Q29ubmVjdGlvbiAuLi4gaWYgbm8gY29ubmVjdGlvbiB3YXMgcGFzc2VkOg0KJyAg +ICAgICAgMi4gY3JlYXRlIG5ldyBBRE9EQiBjb25uZWN0aW9uIGJhc2VkIG9uIHRo +ZSBPTEVEQiBjb25uZWN0aW9uIHN0cmluZyAodXNlIHByb3BlcnR5IDxkYXRhLmFk +b2RiLkFkb2RiSGFuZGxlcjo6Q29ubmVjdGlvblN0cmluZz4pDQonDQonICAgICBJ +ZiBhIHJlZmVyZW5jZSB0byBhbiBBRE9EQiBjb25uZWN0aW9uIGFscmVhZHkgZXhp +c3RzLCBpdCB3aWxsIGJlIGNoZWNrZWQgaWYgaXQgaXMgY2xvc2VkIGFuZCBvcGVu +ZWQgaWYgbmVjZXNzYXJ5Lg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBDdXJyZW50Q29ubmVj +dGlvbigpIEFzIEFET0RCLkNvbm5lY3Rpb24NCg0KICAgRGltIHN0ckNvbm5TdHJp +bmcgQXMgU3RyaW5nDQoNCiAgIElmIChtX0Fkb0Nvbm5lY3Rpb24gSXMgTm90aGlu +ZykgVGhlbg0KICAgICAgJ1JlcXVlc3QgY29ubmVjdGlvbiB2aWEgZXZlbnQuDQog +ICAgICBSYWlzZUV2ZW50IEVycm9yTWlzc2luZ0N1cnJlbnRDb25uZWN0aW9uKCJV +bmF2YWlsYWJsZSBDdXJyZW50Q29ubmVjdGlvbiIsIG1fQWRvQ29ubmVjdGlvbikN +CiAgICAgIElmIChtX0Fkb0Nvbm5lY3Rpb24gSXMgTm90aGluZykgVGhlbg0KICAg +ICAgICAgJ1NldCBuZXcgY29ubmVjdGlvbiBpZiBubyBjb25uZWN0aW9uIHdhcyBw +YXNzZWQgYnkgZXZlbnQNCiAgICAgICAgIHN0ckNvbm5TdHJpbmcgPSBDb25uZWN0 +aW9uU3RyaW5nDQogICAgICAgICBJZiBMZW4oc3RyQ29ublN0cmluZykgPiAwIFRo +ZW4NCiAgICAgICAgICAgIFNldCBtX0Fkb0Nvbm5lY3Rpb24gPSBOZXcgQURPREIu +Q29ubmVjdGlvbg0KICAgICAgICAgICAgbV9BZG9Db25uZWN0aW9uLk9wZW4gc3Ry +Q29ublN0cmluZw0KICAgICAgICAgRW5kIElmDQogICAgICBFbmQgSWYNCiAgIEVs +c2VJZiAobV9BZG9Db25uZWN0aW9uLlN0YXRlIDw+IE9iamVjdFN0YXRlRW51bS5h +ZFN0YXRlT3BlbikgVGhlbg0KICAgICAgSWYgTGVuKG1fQWRvQ29ubmVjdGlvbi5D +b25uZWN0aW9uU3RyaW5nKSA+IDAgVGhlbg0KICAgICAgICAgbV9BZG9Db25uZWN0 +aW9uLk9wZW4NCiAgICAgIEVsc2UgJyhyZSlvcGVuIGNvbm5lY3Rpb24NCiAgICAg +ICAgIG1fQWRvQ29ubmVjdGlvbi5PcGVuIENvbm5lY3Rpb25TdHJpbmcNCiAgICAg +IEVuZCBJZg0KICAgRW5kIElmDQogICBTZXQgQ3VycmVudENvbm5lY3Rpb24gPSBt +X0Fkb0Nvbm5lY3Rpb24NCg0KRW5kIFByb3BlcnR5DQoNClB1YmxpYyBQcm9wZXJ0 +eSBTZXQgQ3VycmVudENvbm5lY3Rpb24oQnlSZWYgTmV3Q29ubmVjdGlvbiBBcyBB +RE9EQi5Db25uZWN0aW9uKQ0KICAgSWYgTm90IChtX0Fkb0Nvbm5lY3Rpb24gSXMg +Tm90aGluZykgVGhlbg0KICAgICAgSWYgbV9BZG9Db25uZWN0aW9uLlN0YXRlIDw+ +IGFkU3RhdGVDbG9zZWQgVGhlbg0KICAgICAgICAgbV9BZG9Db25uZWN0aW9uLkNs +b3NlDQogICAgICBFbmQgSWYNCiAgICAgIFNldCBtX0Fkb0Nvbm5lY3Rpb24gPSBO +b3RoaW5nDQogICBFbmQgSWYNCiAgIFNldCBtX0Fkb0Nvbm5lY3Rpb24gPSBOZXdD +b25uZWN0aW9uDQpFbmQgUHJvcGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogQ29ubmVjdGlvblN0cmlu +Zw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0K +JyBPTEVEQiBjb25uZWN0aW9uIHN0cmluZw0KJw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBDb25u +ZWN0aW9uU3RyaW5nKCkgQXMgU3RyaW5nDQogICBJZiBMZW4obV9BZG9Db25uZWN0 +aW9uU3RyaW5nKSA9IDAgVGhlbg0KICAgICAgSWYgTm90IChtX0Fkb0Nvbm5lY3Rp +b24gSXMgTm90aGluZykgVGhlbg0KICAgICAgICAgbV9BZG9Db25uZWN0aW9uU3Ry +aW5nID0gbV9BZG9Db25uZWN0aW9uLkNvbm5lY3Rpb25TdHJpbmcNCiAgICAgIEVu +ZCBJZg0KICAgICAgSWYgTGVuKG1fQWRvQ29ubmVjdGlvblN0cmluZykgPSAwIFRo +ZW4NCiAgICAgICAgIFJhaXNlRXZlbnQgRXJyb3JFbXB0eUNvbm5lY3Rpb25TdHJp +bmcoIkFkb2RiSGFuZGxlci5Db25uZWN0aW9uU3RyaW5nIiwgbV9BZG9Db25uZWN0 +aW9uU3RyaW5nKQ0KICAgICAgRW5kIElmDQogICBFbmQgSWYNCiAgIENvbm5lY3Rp +b25TdHJpbmcgPSBtX0Fkb0Nvbm5lY3Rpb25TdHJpbmcNCkVuZCBQcm9wZXJ0eQ0K +DQpQdWJsaWMgUHJvcGVydHkgTGV0IENvbm5lY3Rpb25TdHJpbmcoQnlWYWwgVmFs +dWUgQXMgU3RyaW5nKQ0KICAgU2V0IEN1cnJlbnRDb25uZWN0aW9uID0gTm90aGlu +Zw0KICAgbV9BZG9Db25uZWN0aW9uU3RyaW5nID0gVmFsdWUNCkVuZCBQcm9wZXJ0 +eQ0KDQonIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIw0KJyBHcm91cDogRGF0YSBPcGVyYXRpb25zDQoN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVu +Y3Rpb246IEV4ZWN1dGUNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicNCicgRXhlY3V0ZSBTUUwgc3RhdGVtZW50DQonDQonIFBhcmFt +ZXRlcnM6DQonICAgICBDb21tYW5kVGV4dCAgICAgICAtIFNRTCBzdGF0ZW1lbnQN +CicgICAgIFJlY29yZHNBZmZlY3RlZCAgIC0gQnlSZWYgcGFyYW1ldGVyIHRvIHJl +dHVybiB0aGUgbnVtYmVyIG9mIHJlY29yZHMgYWZmZWN0ZWQgYnkgdGhlIEV4ZWN1 +dGUgc3RhdGVtZW50Lg0KJyAgICAgT3B0aW9ucyAgICAgICAgICAgLSBhZGRpdGlv +bmFsIG9wdGlvbnMgb2YgdGhlIEFET0RCLkNvbm5lY3Rpb24uRXhlY3V0ZSBtZXRo +b2QNCicNCicgUmV0dXJuczoNCicgICAgIEFET0RCLlJlY29yZHNldA0KJw0KJyBS +ZW1hcmtzOg0KJyAgICAgRW5jYXBzdWxhdGlvbiBvZiB0aGUgQURPREIuQ29ubmVj +dGlvbi5FeGVjdXRlIG1ldGhvZCAocGFyYW1ldGVycyBhcmUgcGFzc2VkIG9uIDE6 +MSkNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +ClB1YmxpYyBGdW5jdGlvbiBFeGVjdXRlKEJ5VmFsIENvbW1hbmRUZXh0IEFzIFN0 +cmluZywgXw0KICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlSZWYgUmVjb3Jkc0Fm +ZmVjdGVkIEFzIExvbmcsIF8NCiAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFs +IE9wdGlvbnMgQXMgQURPREIuRXhlY3V0ZU9wdGlvbkVudW0gPSAtMSkgQXMgQURP +REIuUmVjb3Jkc2V0DQogICBTZXQgRXhlY3V0ZSA9IE1lLkN1cnJlbnRDb25uZWN0 +aW9uLkV4ZWN1dGUoQ29tbWFuZFRleHQsIFJlY29yZHNBZmZlY3RlZCwgT3B0aW9u +cykNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBFeGVjdXRlQ29tbWFuZA0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBFeGVjdXRl +IHNxbCBzdGF0ZW1lbnQgdXNpbmcgQURPREIuQ29tbWFuZA0KJw0KJyBQYXJhbWV0 +ZXJzOg0KJyAgICAgQ21kVGV4dCAgICAgICAgICAgLSBBRE9EQi5Db21tYW5kVGV4 +dCB2YWx1ZQ0KJyAgICAgQ21kVHlwZSAgICAgICAgICAgLSBBRE9EQi5Db21tYW5k +VHlwZSB2YWx1ZQ0KJyAgICAgQ21kUGFyYW1EZWZzICAgICAgLSAyLWRpbWVuc2lv +bmFsIHBhcmFtZXRlciBhcnJheSAoQXJyYXkobiwxKSAuLi4geChuLDApID0gcGFy +YW1ldGVyIG5hbWUsIHgobiwxKSA9IHBhcmFtZXRlciB2YWx1ZSkNCicgICAgIFJl +Y29yZHNBZmZlY3RlZCAgIC0gQnlSZWYgcGFyYW1ldGVyIHRvIHJldHVybiB0aGUg +bnVtYmVyIG9mIHJlY29yZHMgYWZmZWN0ZWQgYnkgdGhlIEV4ZWN1dGUgc3RhdGVt +ZW50Lg0KJyAgICAgT3B0aW9ucyAgICAgICAgICAgLSBhZGRpdGlvbmFsIG9wdGlv +bnMgb2YgdGhlIEFET0RCLkNvbW1hbmQuRXhlY3V0ZSBtZXRob2QNCicNCicgUmV0 +dXJuczoNCicgICAgIEFET0RCLlJlY29yZHNldA0KJw0KJyBSZW1hcmtzOg0KJyAg +ICAgV2l0aCB0aGlzIHZhcmlhbnQsIFNRTCBpbmplY3Rpb24gY2FuIGJlIGF2b2lk +ZWQgdmVyeSBlYXNpbHksDQonICAgICBzaW5jZSB0aGUgcGFyYW1ldGVycyBhcmUg +bm90IGJ1aWx0IGRpcmVjdGx5IGludG8gdGhlIFNRTCBzdGF0ZW1lbnQNCicgICAg +IGFuZCB0aHVzIGEgcGFyYW1ldGVyIHZhbHVlICh3aGljaCBjb21lcyBmcm9tIGEg +dXNlciBpbnB1dCwgZm9yIGV4YW1wbGUpIGNhbm5vdCBpbmplY3QgYW4gU1FMIHN0 +YXRlbWVudC4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NClB1YmxpYyBGdW5jdGlvbiBFeGVjdXRlQ29tbWFuZChCeVZhbCBDbWRU +ZXh0IEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IEJ5VmFsIENtZFR5cGUgQXMgQURPREIuQ29tbWFuZFR5cGVFbnVtLCBfDQogICAg +ICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgQ21kUGFyYW1EZWZzIEFz +IFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVJl +ZiBSZWNvcmRzQWZmZWN0ZWQgQXMgTG9uZywgXw0KICAgICAgICAgICAgICAgICAg +ICAgIE9wdGlvbmFsIEJ5VmFsIE9wdGlvbnMgQXMgTG9uZyA9IC0xKSBBcyBBRE9E +Qi5SZWNvcmRzZXQNCiAgICAgICAgICAgICAgICAgICAgICANCiAgIERpbSBjbWQg +QXMgQURPREIuQ29tbWFuZA0KICAgRGltIFBhcmFtRGVmc0FycmF5U2l6ZSBBcyBM +b25nDQogICBEaW0gaSBBcyBMb25nDQogICBEaW0gUGFyYW1OYW1lIEFzIFN0cmlu +Zw0KDQogICBTZXQgY21kID0gTmV3IEFET0RCLkNvbW1hbmQNCiAgIFdpdGggY21k +DQogICANCiAgICAgIFNldCAuQWN0aXZlQ29ubmVjdGlvbiA9IE1lLkN1cnJlbnRD +b25uZWN0aW9uDQogICAgICAuQ29tbWFuZFRleHQgPSBDbWRUZXh0DQogICAgICAu +Q29tbWFuZFR5cGUgPSBDbWRUeXBlDQogICANCiAgICAgIElmIE5vdCBJc01pc3Np +bmcoQ21kUGFyYW1EZWZzKSBUaGVuDQogICAgICAgICBQYXJhbURlZnNBcnJheVNp +emUgPSBVQm91bmQoQ21kUGFyYW1EZWZzLCAxKQ0KICAgICAgICAgRm9yIGkgPSAw +IFRvIFBhcmFtRGVmc0FycmF5U2l6ZQ0KICAgICAgICAgICAgUGFyYW1OYW1lID0g +TnooQ21kUGFyYW1EZWZzKGksIDApLCB2Yk51bGxTdHJpbmcpDQogICAgICAgICAg +ICBJZiBMZW4oUGFyYW1OYW1lKSA+IDAgVGhlbg0KICAgICAgICAgICAgICAgLlBh +cmFtZXRlcnMoUGFyYW1OYW1lKS5WYWx1ZSA9IENtZFBhcmFtRGVmcyhpLCAxKQ0K +ICAgICAgICAgICAgRW5kIElmDQogICAgICAgICBOZXh0IGkNCiAgICAgIEVuZCBJ +Zg0KICAgICAgDQogICAgICBTZXQgRXhlY3V0ZUNvbW1hbmQgPSAuRXhlY3V0ZShS +ZWNvcmRzQWZmZWN0ZWQsICwgT3B0aW9ucykNCiAgICAgIA0KICAgRW5kIFdpdGgN +CiAgIFNldCBjbWQgPSBOb3RoaW5nDQoNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBP +cGVuUmVjb3Jkc2V0DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonDQonIE9wdGltaXplcyBBRE9EQi5SZWNvcmRzZXQuT3BlbiBtZXRo +b2QNCicNCicgUGFyYW1ldGVyczoNCicgICAgIFNvdXJjZSAgICAgICAgICAgICAg +ICAgIC0gRGF0YSBzb3VyY2UgKGUuZy4gU1FMIHN0YXRlbWVudCkNCicgICAgIEN1 +cnNvclR5cGUgICAgICAgICAgICAgIC0gQURPREIuQ3Vyc29yVHlwZUVudW0gdmFs +dWUNCicgICAgIExvY2tUeXBlICAgICAgICAgICAgICAgIC0gQURPREIuTG9ja1R5 +cGVFbnVtIHZhbHVlDQonICAgICBDdXJzb3JMb2NhdGlvbiAgICAgICAgICAtIEFE +T0RCLkN1cnNvckxvY2F0aW9uRW51bSB2YWx1ZQ0KJyAgICAgRGlzY29ubmVjdGVk +UmVjb3Jkc2V0ICAgLSBUcnVlOiBkaXNjb25uZWN0IGNvbm5lY3Rpb24gZnJvbSBy +ZWNvcmRzZXQgYWZ0ZXIgb3BlbmluZw0KJw0KJyBSZXR1cm5zOg0KJyAgICAgQURP +REIuUmVjb3Jkc2V0DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gT3BlblJlY29yZHNldChCeVZhbCBT +b3VyY2UgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAgICAgICBPcHRpb25h +bCBCeVZhbCBDdXJzb3JUeXBlIEFzIEFET0RCLkN1cnNvclR5cGVFbnVtID0gQURP +REIuQ3Vyc29yVHlwZUVudW0uYWRPcGVuRm9yd2FyZE9ubHksIF8NCiAgICAgICAg +ICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIExvY2tUeXBlIEFzIEFET0RCLkxv +Y2tUeXBlRW51bSA9IEFET0RCLkxvY2tUeXBlRW51bS5hZExvY2tSZWFkT25seSwg +Xw0KICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgQ3Vyc29yTG9j +YXRpb24gQXMgQURPREIuQ3Vyc29yTG9jYXRpb25FbnVtID0gLTEsIF8NCiAgICAg +ICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIERpc2Nvbm5lY3RlZFJlY29y +ZHNldCBBcyBCb29sZWFuID0gRmFsc2UpIEFzIEFET0RCLlJlY29yZHNldA0KDQog +ICBEaW0gcnN0IEFzIEFET0RCLlJlY29yZHNldA0KICAgDQogICBJZiBDdXJzb3JM +b2NhdGlvbiA9IC0xIFRoZW4NCiAgICAgIEN1cnNvckxvY2F0aW9uID0gbV9EZWZh +dWx0Q3Vyc29yTG9jYXRpb24NCiAgIEVuZCBJZg0KICAgDQogICBJZiBEaXNjb25u +ZWN0ZWRSZWNvcmRzZXQgVGhlbg0KICAgICAgSWYgQ3Vyc29yTG9jYXRpb24gPSBh +ZFVzZVNlcnZlciBUaGVuDQogICAgICAgICBDdXJzb3JMb2NhdGlvbiA9IGFkVXNl +Q2xpZW50DQogICAgICBFbmQgSWYNCiAgICAgIElmIEN1cnNvclR5cGUgPSBhZE9w +ZW5Gb3J3YXJkT25seSBUaGVuDQogICAgICAgICBDdXJzb3JUeXBlID0gYWRPcGVu +S2V5c2V0DQogICAgICBFbmQgSWYNCiAgIEVuZCBJZg0KDQogICBTZXQgcnN0ID0g +TmV3IEFET0RCLlJlY29yZHNldA0KICAgV2l0aCByc3QNCiAgICAgIC5DdXJzb3JM +b2NhdGlvbiA9IEN1cnNvckxvY2F0aW9uDQogICAgICAuT3BlbiBTb3VyY2UsIE1l +LkN1cnJlbnRDb25uZWN0aW9uLCBDdXJzb3JUeXBlLCBMb2NrVHlwZQ0KICAgICAg +DQogICAgICBJZiBEaXNjb25uZWN0ZWRSZWNvcmRzZXQgVGhlbg0KICAgICAgICAg +U2V0IC5BY3RpdmVDb25uZWN0aW9uID0gTm90aGluZw0KICAgICAgRW5kIElmDQog +ICAgICANCiAgIEVuZCBXaXRoDQogICBTZXQgT3BlblJlY29yZHNldCA9IHJzdA0K +ICAgDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogT3BlblJlY29yZHNldENvbW1hbmRQ +YXJhbQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +Jw0KJyBPcGVuIHJlY29yZHNldCB1c2luZyBBRE9EQi5Db21tYW5kDQonDQonIFBh +cmFtZXRlcnM6DQonICAgICBDbWRUZXh0ICAgICAgICAgICAgICAgICAtIEFET0RC +LkNvbW1hbmRUZXh0IHZhbHVlDQonICAgICBDbWRUeXBlICAgICAgICAgICAgICAg +ICAtIEFET0RCLkNvbW1hbmRUeXBlIHZhbHVlDQonICAgICBDbWRQYXJhbURlZnMg +ICAgICAgICAgICAtIDItZGltZW5zaW9uYWwgcGFyYW1ldGVyIGFycmF5IChBcnJh +eShuLDEpIC4uLiB4KG4sMCkgPSBwYXJhbWV0ZXIgbmFtZSwgeChuLDEpID0gcGFy +YW1ldGVyIHZhbHVlKQ0KJyAgICAgUmVjb3Jkc0FmZmVjdGVkICAgICAgICAgLSBC +eVJlZiBwYXJhbWV0ZXIgdG8gcmV0dXJuIHRoZSBudW1iZXIgb2YgcmVjb3JkcyBh +ZmZlY3RlZCBieSB0aGUgRXhlY3V0ZSBzdGF0ZW1lbnQuDQonICAgICBPcHRpb25z +ICAgICAgICAgICAgICAgICAtIGFkZGl0aW9uYWwgb3B0aW9ucyBvZiB0aGUgQURP +REIuQ29tbWFuZC5FeGVjdXRlIG1ldGhvZA0KJyAgICAgRGlzY29ubmVjdGVkUmVj +b3Jkc2V0ICAgLSBUcnVlOiBkaXNjb25uZWN0IGNvbm5lY3Rpb24gZnJvbSByZWNv +cmRzZXQgYWZ0ZXIgb3BlbmluZw0KJw0KJyBSZXR1cm5zOg0KJyAgICAgQURPREIu +UmVjb3Jkc2V0DQonDQonIFJlbWFya3M6DQonICAgICBXaXRoIHRoaXMgdmFyaWFu +dCwgU1FMIGluamVjdGlvbiBjYW4gYmUgYXZvaWRlZCB2ZXJ5IGVhc2lseSwNCicg +ICAgIHNpbmNlIHRoZSBwYXJhbWV0ZXJzIGFyZSBub3QgYnVpbHQgZGlyZWN0bHkg +aW50byB0aGUgU1FMIHN0YXRlbWVudA0KJyAgICAgYW5kIHRodXMgYSBwYXJhbWV0 +ZXIgdmFsdWUgKHdoaWNoIGNvbWVzIGZyb20gYSB1c2VyIGlucHV0LCBmb3IgZXhh +bXBsZSkgY2Fubm90IGluamVjdCBhbiBTUUwgc3RhdGVtZW50Lg0KJw0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0 +aW9uIE9wZW5SZWNvcmRzZXRDb21tYW5kUGFyYW0oQnlWYWwgQ21kVGV4dCBBcyBT +dHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIEJ5VmFsIENtZFR5cGUgQXMgQURPREIuQ29tbWFuZFR5cGVFbnVtLCBfDQog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBD +bWRQYXJhbURlZnMgQXMgVmFyaWFudCwgXw0KICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgT3B0aW9uYWwgQnlSZWYgUmVjb3Jkc0FmZmVjdGVkIEFzIExv +bmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFs +IEJ5VmFsIE9wdGlvbnMgQXMgTG9uZyA9IC0xLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBEaXNjb25uZWN0ZWRSZWNv +cmRzZXQgQXMgQm9vbGVhbiA9IEZhbHNlKSBBcyBBRE9EQi5SZWNvcmRzZXQNCg0K +ICAgRGltIHJzdCBBcyBBRE9EQi5SZWNvcmRzZXQNCiAgIA0KICAgU2V0IHJzdCA9 +IEV4ZWN1dGVDb21tYW5kKENtZFRleHQsIENtZFR5cGUsIENtZFBhcmFtRGVmcywg +UmVjb3Jkc0FmZmVjdGVkLCBPcHRpb25zKQ0KICAgSWYgRGlzY29ubmVjdGVkUmVj +b3Jkc2V0IFRoZW4NCiAgICAgIFNldCByc3QuQWN0aXZlQ29ubmVjdGlvbiA9IE5v +dGhpbmcNCiAgIEVuZCBJZg0KICAgDQogICBTZXQgT3BlblJlY29yZHNldENvbW1h +bmRQYXJhbSA9IHJzdA0KDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogTG9va3VwU1FM +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQon +IExvb2t1cCBBRE9EQi5SZWNvcmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9y +IERMb29rdXAgKHBhc3NpbmcgYSBTUUwgc3RhdGVtZW50KQ0KJw0KJyBQYXJhbWV0 +ZXJzOg0KJyAgICAgU3FsVGV4dCAgICAgLSBTUUwgc3RhdGVtZW50DQonICAgICBJ +bmRleCAgICAgICAtIEZpZWxkIHNlbGVjdGlvbiBpZiB0aGUgZmlyc3QgZmllbGQg +b2YgdGhlIHJlY29yZHNldCBpcyBub3QgdG8gYmUgcmV0dXJuZWQuDQonICAgICAg +ICAgICAgICAgICAgIFRoZSBpbmRleCBpcyBwYXNzZWQgaW4gdGhlIHNhbWUgd2F5 +IGFzIEFET0RCLlJlY29yZHNldC5GaWVsZHMoaW5kZXgpLg0KJyAgICAgVmFsdWVJ +Zk51bGwgLSBSZXR1cm4gdmFsdWUgaWYgcmVjb3JkIGlzIG1pc3Npbmcgb3IgZGF0 +YSBmaWVsZCB2YWx1ZSBpcyBOdWxsIChkZWZhdWx0OiBOdWxsKS4NCicNCicgUmV0 +dXJuczoNCicgICAgIFZhcmlhbnQgIC0gTnVsbCwgaWYgU1FMIHN0YXRlbWVudCBk +b2VzIG5vdCByZXR1cm4gYSByZWNvcmQuDQonDQonIFJlbWFya3M6DQonICAgICBU +aGUgU1FMIHN0YXRlbWVudCBtdXN0IGJlIHdyaXR0ZW4gaW4gdGhlIFNRTCBkaWFs +ZWN0IG9mIHRoZSBEQk1TIGNvbmNlcm5lZC4NCicNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBMb29rdXBT +cWwoQnlWYWwgU3FsVGV4dCBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAg +T3B0aW9uYWwgQnlWYWwgSW5kZXggQXMgVmFyaWFudCA9IDAmLCBfDQogICAgICAg +ICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIFZhbHVlSWZOdWxsIEFzIFZhcmlhbnQg +PSBOdWxsKSBBcyBWYXJpYW50DQoNCiAgIERpbSByc3QgQXMgQURPREIuUmVjb3Jk +c2V0DQoNCk9uIEVycm9yIEdvVG8gSGFuZGxlRXJyDQoNCiAgIFNldCByc3QgPSBN +ZS5PcGVuUmVjb3Jkc2V0KFNxbFRleHQsIGFkT3BlbkZvcndhcmRPbmx5LCBhZExv +Y2tSZWFkT25seSwgYWRVc2VTZXJ2ZXIpDQogICBXaXRoIHJzdA0KICAgICAgSWYg +LkVPRiBUaGVuDQogICAgICAgICBMb29rdXBTcWwgPSBWYWx1ZUlmTnVsbA0KICAg +ICAgRWxzZQ0KICAgICAgICAgTG9va3VwU3FsID0gTnooLkZpZWxkcyhJbmRleCks +IFZhbHVlSWZOdWxsKQ0KICAgICAgRW5kIElmDQogICAgICAuQ2xvc2UNCiAgIEVu +ZCBXaXRoDQogICBTZXQgcnN0ID0gTm90aGluZw0KDQpFeGl0SGVyZToNCiAgIEV4 +aXQgRnVuY3Rpb24NCiAgIA0KSGFuZGxlRXJyOg0KICAgSWYgTm90IChyc3QgSXMg +Tm90aGluZykgVGhlbg0KICAgICAgcnN0LkNsb3NlDQogICAgICBTZXQgcnN0ID0g +Tm90aGluZw0KICAgRW5kIElmDQoNCiAgIEVyci5SYWlzZSBFcnIuTnVtYmVyLCAi +TG9va3VwU1FMOiIgJiBFcnIuU291cmNlLCBFcnIuRGVzY3JpcHRpb24sIEVyci5I +ZWxwRmlsZSwgRXJyLkhlbHBDb250ZXh0DQoNCkVuZCBGdW5jdGlvbg0KDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9u +OiBMb29rdXANCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NCicNCicgQURPREIuUmVjb3Jkc2V0IHJlcGxhY2VtZW50IGZ1bmN0aW9uIGZv +ciBETG9va3VwDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBFeHByICAgICAgICAt +IEZpZWxkIG5hbWUgb3IgY2FsY3VsYXRlZCBleHByZXNzaW9uIChzZWxlY3QgcGFy +dCkNCicgICAgIERvbWFpbiAgICAgIC0gVGFibGUsIHF1ZXJ5IG9yIFNRTCBleHBy +ZXNzaW9uIGZvciBzdWItcXVlcnkgKEZST00gcGFydCkNCicgICAgIENyaXRlcmlh +ICAgIC0gKE9wdGlvbmFsKSBDcml0ZXJpYSBzdHJpbmcgKFdIRVJFIHBhcnQpDQon +ICAgICBWYWx1ZUlmTnVsbCAtIFJldHVybiB2YWx1ZSBpZiByZWNvcmQgaXMgbWlz +c2luZyBvciBkYXRhIGZpZWxkIHZhbHVlIGlzIE51bGwgKGRlZmF1bHQ6IE51bGwp +Lg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgVmFyaWFudA0KJw0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIExv +b2t1cChCeVZhbCBFeHByIEFzIFN0cmluZywgQnlWYWwgRG9tYWluIEFzIFN0cmlu +ZywgXw0KICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBDcml0ZXJpYSBBcyBW +YXJpYW50LCBfDQogICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIFZhbHVlSWZO +dWxsIEFzIFZhcmlhbnQgPSBOdWxsKSBBcyBWYXJpYW50DQoNCiAgIERpbSBTZWxl +Y3RTcWwgQXMgU3RyaW5nDQoNCiAgIFNlbGVjdFNxbCA9IEJ1aWxkU2VsZWN0U3Fs +KEV4cHIsIERvbWFpbiwgQ3JpdGVyaWEsIEZhbHNlKQ0KICAgTG9va3VwID0gTWUu +TG9va3VwU3FsKFNlbGVjdFNxbCwgLCBWYWx1ZUlmTnVsbCkNCg0KRW5kIEZ1bmN0 +aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gQnVpbGRTZWxlY3RTcWwoQnlWYWwgRXhw +ciBBcyBTdHJpbmcsIEJ5VmFsIERvbWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5 +VmFsIENyaXRlcmlhIEFzIFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAgICAgICAg +ICAgT3B0aW9uYWwgQnlWYWwgRGlzdGluY3QgQXMgQm9vbGVhbiA9IEZhbHNlKQ0K +DQogICBEaW0gU2VsZWN0U3FsIEFzIFN0cmluZw0KDQogICBTZWxlY3RTcWwgPSAi +U0VMRUNUICINCiAgIElmIERpc3RpbmN0IFRoZW4NCiAgICAgIFNlbGVjdFNxbCA9 +IFNlbGVjdFNxbCAmICJEaXN0aW5jdCAiDQogICBFbmQgSWYNCiAgIFNlbGVjdFNx +bCA9IFNlbGVjdFNxbCAmIEV4cHIgJiAiIEZST00gKCIgJiBEb21haW4gJiAiKSIN +CiAgIElmIE5vdCAoVmFyVHlwZShDcml0ZXJpYSkgPSB2YkVycm9yKSBUaGVuDQog +ICAgICBJZiBMZW4oQ3JpdGVyaWEpID4gMCBUaGVuDQogICAgICAgICBTZWxlY3RT +cWwgPSBTZWxlY3RTcWwgJiAiIFdIRVJFICIgJiBDcml0ZXJpYQ0KICAgICAgRW5k +IElmDQogICBFbmQgSWYNCiAgIA0KICAgQnVpbGRTZWxlY3RTcWwgPSBTZWxlY3RT +cWwNCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IENvdW50DQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEFET0RCLlJlY29yZHNl +dCByZXBsYWNlbWVudCBmdW5jdGlvbiBmb3IgRENvdW50DQonDQonIFBhcmFtZXRl +cnM6DQonICAgICBFeHByICAgICAgICAtIEZpZWxkIG5hbWUgb3IgY2FsY3VsYXRl +ZCBleHByZXNzaW9uIChzZWxlY3QgcGFydCkNCicgICAgIERvbWFpbiAgICAgIC0g +VGFibGUsIHF1ZXJ5IG9yIFNRTCBleHByZXNzaW9uIGZvciBzdWItcXVlcnkgKEZS +T00gcGFydCkNCicgICAgIENyaXRlcmlhICAgIC0gKE9wdGlvbmFsKSBDcml0ZXJp +YSBzdHJpbmcgKFdIRVJFIHBhcnQpDQonDQonIFJldHVybnM6DQonICAgICBMb25n +DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQ +dWJsaWMgRnVuY3Rpb24gQ291bnQoQnlWYWwgRXhwciBBcyBTdHJpbmcsIEJ5VmFs +IERvbWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFzIFZh +cmlhbnQsIF8NCiAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBEaXN0aW5jdCBB +cyBCb29sZWFuID0gRmFsc2UpIEFzIExvbmcNCiAgICAgICAgICAgICANCiAgIElm +IERpc3RpbmN0IFRoZW4NCiAgICAgIElmIEV4cHIgPD4gIioiIFRoZW4NCiAgICAg +ICAgIERvbWFpbiA9ICIoIiAmIEJ1aWxkU2VsZWN0U3FsKEV4cHIsIERvbWFpbiwg +Q3JpdGVyaWEsIFRydWUpICYgIikiDQogICAgICAgICBDcml0ZXJpYSA9IHZiTnVs +bFN0cmluZw0KICAgICAgRW5kIElmDQogICBFbmQgSWYNCiAgIA0KICAgQ291bnQg +PSBOeihNZS5Mb29rdXAoIkNvdW50KCIgJiBFeHByICYgIikiLCBEb21haW4sIENy +aXRlcmlhKSwgMCkNCiAgIA0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IE1heA0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBBRE9E +Qi5SZWNvcmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIERNYXgNCicNCicg +UGFyYW1ldGVyczoNCicgICAgIEV4cHIgICAgICAgIC0gRmllbGQgbmFtZSBvciBj +YWxjdWxhdGVkIGV4cHJlc3Npb24gKHNlbGVjdCBwYXJ0KQ0KJyAgICAgRG9tYWlu +ICAgICAgLSBUYWJsZSwgcXVlcnkgb3IgU1FMIGV4cHJlc3Npb24gZm9yIHN1Yi1x +dWVyeSAoRlJPTSBwYXJ0KQ0KJyAgICAgQ3JpdGVyaWEgICAgLSAoT3B0aW9uYWwp +IENyaXRlcmlhIHN0cmluZyAoV0hFUkUgcGFydCkNCicNCicgUmV0dXJuczoNCicg +ICAgIFZhcmlhbnQNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBNYXgoQnlWYWwgRXhwciBBcyBTdHJp +bmcsIEJ5VmFsIERvbWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRl +cmlhIEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQNCiAgIE1heCA9IE1lLkxvb2t1cCgi +TWF4KCIgJiBFeHByICYgIikiLCBEb21haW4sIENyaXRlcmlhKQ0KRW5kIEZ1bmN0 +aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicgRnVuY3Rpb246IE1pbg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJw0KJyBBRE9EQi5SZWNvcmRzZXQgcmVwbGFjZW1lbnQgZnVu +Y3Rpb24gZm9yIERNaW4NCicNCicgUGFyYW1ldGVyczoNCicgICAgIEV4cHIgICAg +ICAgIC0gRmllbGQgbmFtZSBvciBjYWxjdWxhdGVkIGV4cHJlc3Npb24gKHNlbGVj +dCBwYXJ0KQ0KJyAgICAgRG9tYWluICAgICAgLSBUYWJsZSwgcXVlcnkgb3IgU1FM +IGV4cHJlc3Npb24gZm9yIHN1Yi1xdWVyeSAoRlJPTSBwYXJ0KQ0KJyAgICAgQ3Jp +dGVyaWEgICAgLSAoT3B0aW9uYWwpIENyaXRlcmlhIHN0cmluZyAoV0hFUkUgcGFy +dCkNCicNCicgUmV0dXJuczoNCicgICAgIFZhcmlhbnQNCicNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBN +aW4oQnlWYWwgRXhwciBBcyBTdHJpbmcsIEJ5VmFsIERvbWFpbiBBcyBTdHJpbmcs +IE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQN +CiAgIE1pbiA9IE1lLkxvb2t1cCgiTWluKCIgJiBFeHByICYgIikiLCBEb21haW4s +IENyaXRlcmlhKQ0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IFN1bQ0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBBRE9EQi5SZWNv +cmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIERTdW0NCicNCicgUGFyYW1l +dGVyczoNCicgICAgIEV4cHIgICAgICAgIC0gRmllbGQgbmFtZSBvciBjYWxjdWxh +dGVkIGV4cHJlc3Npb24gKHNlbGVjdCBwYXJ0KQ0KJyAgICAgRG9tYWluICAgICAg +LSBUYWJsZSwgcXVlcnkgb3IgU1FMIGV4cHJlc3Npb24gZm9yIHN1Yi1xdWVyeSAo +RlJPTSBwYXJ0KQ0KJyAgICAgQ3JpdGVyaWEgICAgLSAoT3B0aW9uYWwpIENyaXRl +cmlhIHN0cmluZyAoV0hFUkUgcGFydCkNCicNCicgUmV0dXJuczoNCicgICAgIFZh +cmlhbnQNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NClB1YmxpYyBGdW5jdGlvbiBTdW0oQnlWYWwgRXhwciBBcyBTdHJpbmcsIEJ5 +VmFsIERvbWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFz +IFZhcmlhbnQpIEFzIFZhcmlhbnQNCiAgIFN1bSA9IE1lLkxvb2t1cCgiU3VtKCIg +JiBFeHByICYgIikiLCBEb21haW4sIENyaXRlcmlhKQ0KRW5kIEZ1bmN0aW9uDQoN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVu +Y3Rpb246IEV4aXN0cw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KJw0KJyBDaGVjayBpZiByZWNvcmQgZXhpc3RzDQonDQonIFBhcmFt +ZXRlcnM6DQonICAgICBEb21haW4gICAtIGRhdGEgc291cmNlIChGUk9NIHBhcnQp +DQonICAgICBDcml0ZXJpYSAtIChPcHRpb25hbCkgQ3JpdGVyaWEgc3RyaW5nIChX +SEVSRSBwYXJ0KQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgQm9vbGVhbg0KJw0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1 +bmN0aW9uIEV4aXN0cyhCeVZhbCBEb21haW4gQXMgU3RyaW5nLCBfDQogICAgICAg +ICAgICAgIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFzIFN0cmluZyA9IHZiTnVs +bFN0cmluZykgQXMgQm9vbGVhbg0KDQogICBEaW0gc3RyU1FMIEFzIFN0cmluZw0K +DQogICBzdHJTUUwgPSAiU0VMRUNUIDEgRlJPTSAiICYgRG9tYWluDQogICBJZiBM +ZW4oQ3JpdGVyaWEpID4gMCBUaGVuDQogICAgICBzdHJTUUwgPSBzdHJTUUwgJiAi +IFdIRVJFICIgJiBDcml0ZXJpYQ0KICAgRW5kIElmDQogICBFeGlzdHMgPSAoTG9v +a3VwU3FsKHN0clNRTCwgLCAwKSA9IDEpDQoNCkVuZCBGdW5jdGlvbg0KDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9u +OiBJbnNlcnRJZGVudGl0eVJldHVybg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBFeGVjdXRlIGluc2VydCBTUUwgc3RhdGVt +ZW50IGFuZCByZXR1cm4gbGFzdCBpZGVudGl0eSB2YWx1ZSAoYXV0byB2YWx1ZSkN +CicNCicgUGFyYW1ldGVyczoNCicgICAgIEluc2VydFNRTCAgIC0gSW5zZXJ0IFNR +TCBzdGF0ZW1lbnQNCicNCicgUmV0dXJuczoNCicgICAgIElkZW50aXR5IHZhbHVl +IG9yIE5VTEwgaWYgbm8gcmVjb3JkIHdhcyBhcHBlbmRlZA0KJw0KJyBSZW1hcmtz +Og0KJyAgICAgV29ya3MgZm9yIEpldCBvbmx5IGZyb20gSmV0IDQuMCAoQWNjZXNz +IDIwMDApLCBJZGVudGl0eVRhYmxlIGlzIG9ubHkgYXBwbGljYWJsZSBmb3IgTVNT +UUwsIHVuZGVyIE15U1FMIHRoZSBJREVOVF9DVVJSRU5UIGZ1bmN0aW9uIGRvZXMg +bm90IGV4aXN0Lg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIEluc2VydElkZW50aXR5UmV0dXJuKEJ5 +VmFsIEluc2VydFNRTCBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIElkZW50aXR5 +VGFibGUgQXMgU3RyaW5nID0gdmJOdWxsU3RyaW5nKSBBcyBWYXJpYW50DQoNCiAg +IERpbSBjbm4gQXMgQURPREIuQ29ubmVjdGlvbg0KICAgRGltIHJzdCBBcyBBRE9E +Qi5SZWNvcmRzZXQNCiAgIERpbSBSZWNvcmRzQWZmZWN0ZWQgQXMgTG9uZw0KICAg +RGltIElkZW50aXR5U3FsIEFzIFN0cmluZw0KICAgDQogICBEaW0gQ3VycmVudEhv +b2tSZXN1bWVNb2RlIEFzIExvbmcNCiAgIERpbSBDdXJyZW50SG9va1Jlc3VtZU1l +c3NhZ2UgQXMgVmFyaWFudA0KDQogICBTZXQgY25uID0gTWUuQ3VycmVudENvbm5l +Y3Rpb24NCiAgIA0KICAgSWYgbV9Ib29rc0VuYWJsZWQgVGhlbg0KICAgICAgUmFp +c2VFdmVudCBIb29rSW5zZXJ0SWRlbnRpdHlSZXR1cm4oSW5zZXJ0U1FMLCBJZGVu +dGl0eVRhYmxlLCBjbm4sIElkZW50aXR5U3FsLCBDdXJyZW50SG9va1Jlc3VtZU1v +ZGUsIEN1cnJlbnRIb29rUmVzdW1lTWVzc2FnZSkNCiAgICAgIElmIEN1cnJlbnRI +b29rUmVzdW1lTW9kZSA8PiAwIFRoZW4gJ0hvb2sgZXJtaXR0ZWx0ZSBiZXJlaXRz +IGRhcyBFcmdlYm5pcw0KICAgICAgICAgSW5zZXJ0SWRlbnRpdHlSZXR1cm4gPSBD +dXJyZW50SG9va1Jlc3VtZU1lc3NhZ2UNCiAgICAgICAgIEV4aXQgRnVuY3Rpb24N +CiAgICAgIEVuZCBJZg0KICAgRW5kIElmDQogICANCiAgIGNubi5FeGVjdXRlIElu +c2VydFNRTCwgUmVjb3Jkc0FmZmVjdGVkDQogICANCiAgIElmIFJlY29yZHNBZmZl +Y3RlZCA9IDAgVGhlbg0KICAgICAgSW5zZXJ0SWRlbnRpdHlSZXR1cm4gPSBOdWxs +ICdlcyB3dXJkZSBrZWluIG5ldWVyIERTIGFuZ2Vm/Gd0DQogICAgICBFeGl0IEZ1 +bmN0aW9uDQogICBFbmQgSWYNCg0KICAgSWYgTGVuKElkZW50aXR5U3FsKSA9IDAg +VGhlbg0KICAgICAgSWYgTGVuKElkZW50aXR5VGFibGUpID4gMCBUaGVuDQogICAg +ICAgICBJZGVudGl0eVNxbCA9ICJTRUxFQ1QgSURFTlRfQ1VSUkVOVCgnIiAmIElk +ZW50aXR5VGFibGUgJiAiJykiICd3ZWdlbiB0cmlnZ2VyIC4uIGZ1bmt0aW9uaWVy +dCBuaWNodCBiZWkgYWxsZW4gREJNUyEhIQ0KICAgICAgRWxzZQ0KICAgICAgICAg +SWRlbnRpdHlTcWwgPSAiU0VMRUNUIEBASWRlbnRpdHkiICd6dWxldHp0IHp1Z2V3 +aWVzZW5lciBBdXRvd2VydA0KICAgICAgRW5kIElmDQogICBFbmQgSWYNCg0KT24g +RXJyb3IgR29UbyBIYW5kbGVFcnINCg0KICAgU2V0IHJzdCA9IGNubi5FeGVjdXRl +KElkZW50aXR5U3FsKQ0KICAgV2l0aCByc3QNCiAgICAgIElmIC5FT0YgVGhlbg0K +ICAgICAgICAgSW5zZXJ0SWRlbnRpdHlSZXR1cm4gPSBOdWxsDQogICAgICBFbHNl +DQogICAgICAgICBJbnNlcnRJZGVudGl0eVJldHVybiA9IC5GaWVsZHMoMCkNCiAg +ICAgIEVuZCBJZg0KICAgICAgLkNsb3NlDQogICBFbmQgV2l0aA0KICAgU2V0IHJz +dCA9IE5vdGhpbmcNCiAgIFNldCBjbm4gPSBOb3RoaW5nDQoNCkV4aXRIZXJlOg0K +ICAgRXhpdCBGdW5jdGlvbg0KDQpIYW5kbGVFcnI6DQogICBJZiBOb3QgKHJzdCBJ +cyBOb3RoaW5nKSBUaGVuDQogICAgICByc3QuQ2xvc2UNCiAgICAgIFNldCByc3Qg +PSBOb3RoaW5nDQogICBFbmQgSWYNCg0KICAgRXJyLlJhaXNlIEVyci5OdW1iZXIs +ICJJbnNlcnRJZGVudGl0eVJldHVybjoiICYgRXJyLlNvdXJjZSwgRXJyLkRlc2Ny +aXB0aW9uLCBFcnIuSGVscEZpbGUsIEVyci5IZWxwQ29udGV4dA0KDQpFbmQgRnVu +Y3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJyBGdW5jdGlvbjogSW5zZXJ0VmFsdWVzSWRlbnRpdHlSZXR1cm4NCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQ3JlYXRl +IGFuZCBleGVjdXRlIGluc2VydCBTUUwgc3RhdGVtZW50IGFuZCByZXR1cm4gbGFz +dCBpZGVudGl0eSB2YWx1ZSAoYXV0byB2YWx1ZSkNCicNCicgUGFyYW1ldGVyczoN +CicgICAgIFNvdXJjZSAgICAgICAgIC0gVGFibGUgb3JkZXIgcXVlcnkgbmFtZQ0K +JyAgICAgSW5zZXJ0RmllbGRzICAgLSBQYXJhbUFycmF5OiAiRmllbGQxIiwgVmFs +dWUxLCAiRmllbGQyIiwgVmFsdWUyLCAuLi4uDQonDQonIFJldHVybnM6DQonICAg +ICBJZGVudGl0eSB2YWx1ZSBvciBOVUxMIGlmIG5vIHJlY29yZCB3YXMgYXBwZW5k +ZWQNCicNCicgUmVtYXJrczoNCicgICAgIFdvcmtzIGZvciBKZXQgb25seSBmcm9t +IEpldCA0LjAgKEFjY2VzcyAyMDAwKSwgSWRlbnRpdHlUYWJsZSBpcyBvbmx5IGFw +cGxpY2FibGUgZm9yIE1TU1FMLCB1bmRlciBNeVNRTCB0aGUgSURFTlRfQ1VSUkVO +VCBmdW5jdGlvbiBkb2VzIG5vdCBleGlzdC4NCicNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBJbnNlcnRW +YWx1ZXNJZGVudGl0eVJldHVybihCeVZhbCBTb3VyY2UgQXMgU3RyaW5nLCBQYXJh +bUFycmF5IEluc2VydEZpZWxkcygpIEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQNCg0K +ICAgRGltIHN0ckluc2VydCBBcyBTdHJpbmcNCiAgIERpbSBzdHJWYWx1ZXMgQXMg +U3RyaW5nDQogICBEaW0gaSBBcyBMb25nDQoNCiAgIEZvciBpID0gMCBUbyAoVUJv +dW5kKEluc2VydEZpZWxkcykgLSAxKSBTdGVwIDINCiAgICAgIHN0ckluc2VydCA9 +IHN0ckluc2VydCAmICIsICIgJiBJbnNlcnRGaWVsZHMoaSkNCiAgICAgIHN0clZh +bHVlcyA9IHN0clZhbHVlcyAmICIsICIgJiBJbnNlcnRGaWVsZHMoaSArIDEpDQog +ICBOZXh0IGkNCiAgIHN0ckluc2VydCA9ICJJTlNFUlQgSU5UTyAiICYgU291cmNl +ICYgIiAoIiAmIE1pZChzdHJJbnNlcnQsIDMpICYgIikgVkFMVUVTICgiICYgTWlk +KHN0clZhbHVlcywgMykgJiAiKSINCg0KICAgSW5zZXJ0VmFsdWVzSWRlbnRpdHlS +ZXR1cm4gPSBJbnNlcnRJZGVudGl0eVJldHVybihzdHJJbnNlcnQsIFNvdXJjZSkN +Cg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IFZhbHVlTGlzdA0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBHZW5lcmF0ZSBjb25j +YXQgc3RyaW5nIGZyb20gcmVjb3Jkc2V0IHJlc3VsdA0KJw0KJyBQYXJhbWV0ZXJz +Og0KJyAgICAgU3FsU291cmNlICAgICAgICAgLSBTZWxlY3Qgc3RhdGVtZW50DQon +ICAgICBMaXN0Q29uY2F0U3RyaW5nICAtIChvcHRpb25hbCkgQ2hhcmFjdGVyIHRv +IGpvaW4gcmVzdWx0cywgRGVmYXVsdCA9ICIsICINCicgICAgIFZhbHVlSWZOdWxs +ICAgICAgIC0gKG9wdGlvbmFsKSBWYWx1ZSBpZiBubyByZXN1bHRzLCBEZWZhdWx0 +ID0gTnVsbA0KJw0KJyBSZXR1cm5zOg0KJyAgICAgVmFyaWFudCAgICAgICAgICAg +LSByZXN1bHQgZXhpc3RzOiBzdHJpbmcsIG5vIHJlc3VsdCBleGlzdHM6IFZhbHVl +SWZOdWxsDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQpQdWJsaWMgRnVuY3Rpb24gVmFsdWVMaXN0KEJ5VmFsIFNxbFNvdXJjZSBB +cyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIExpc3RDb25jYXRTdHJpbmcgQXMgU3Ry +aW5nID0gIiwgIiwgT3B0aW9uYWwgVmFsdWVJZk51bGwgQXMgVmFyaWFudCA9IE51 +bGwpIEFzIFZhcmlhbnQNCg0KICAgRGltIExpc3RTdHJpbmcgQXMgU3RyaW5nDQoN +CiAgIFdpdGggT3BlblJlY29yZHNldChTcWxTb3VyY2UsIGFkT3BlbktleXNldCwg +YWRMb2NrT3B0aW1pc3RpYywgYWRVc2VDbGllbnQsIFRydWUpDQogICAgICBEbyBX +aGlsZSBOb3QgLkVPRg0KICAgICAgICAgTGlzdFN0cmluZyA9IExpc3RTdHJpbmcg +JiBMaXN0Q29uY2F0U3RyaW5nICYgLkZpZWxkcygwKQ0KICAgICAgICAgLk1vdmVO +ZXh0DQogICAgICBMb29wDQogICAgICAuQ2xvc2UNCiAgIEVuZCBXaXRoDQoNCiAg +IElmIExlbihMaXN0U3RyaW5nKSA+IDAgVGhlbg0KICAgICAgVmFsdWVMaXN0ID0g +TWlkKExpc3RTdHJpbmcsIDMpDQogICBFbHNlDQogICAgICBWYWx1ZUxpc3QgPSBW +YWx1ZUlmTnVsbA0KICAgRW5kIElmDQoNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBM +b29rdXBTcWxWYWx1ZUNvbGxlY3Rpb24NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicNCicgR2VuZXJhdGUgY29sbGVjdGlvbiBmcm9t +IHJlY29yZHNldCByZXN1bHQNCicNCicgUGFyYW1ldGVyczoNCicgICAgIFNxbFNv +dXJjZSAgICAgICAgIC0gU2VsZWN0IHN0YXRlbWVudA0KJyAgICAgVmFsdWVJZk51 +bGwgICAgICAgLSAob3B0aW9uYWwpIFZhbHVlIGlmIG5vIHJlc3VsdHMsIERlZmF1 +bHQgPSBOdWxsDQonDQonIFJldHVybnM6DQonICAgICBDb2xsZWN0aW9uDQonDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMg +RnVuY3Rpb24gTG9va3VwU3FsVmFsdWVDb2xsZWN0aW9uKEJ5VmFsIFNxbFNvdXJj +ZSBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIFZhbHVlSWZOdWxsIEFzIFZhcmlh +bnQgPSBOdWxsKSBBcyBDb2xsZWN0aW9uDQoNCiAgIERpbSBSZXN1bHRzIEFzIENv +bGxlY3Rpb24NCiAgIERpbSByc3QgQXMgQURPREIuUmVjb3Jkc2V0DQogICBEaW0g +ZmxkIEFzIEFET0RCLkZpZWxkDQoNCiAgIFNldCByc3QgPSBPcGVuUmVjb3Jkc2V0 +KFNxbFNvdXJjZSwgYWRPcGVuS2V5c2V0LCBhZExvY2tPcHRpbWlzdGljLCBhZFVz +ZUNsaWVudCwgVHJ1ZSkNCg0KICAgU2V0IFJlc3VsdHMgPSBOZXcgQ29sbGVjdGlv +bg0KICAgSWYgTm90IHJzdC5FT0YgVGhlbg0KICAgICAgRm9yIEVhY2ggZmxkIElu +IHJzdC5GaWVsZHMNCiAgICAgICAgIFJlc3VsdHMuQWRkIE56KGZsZC5WYWx1ZSwg +VmFsdWVJZk51bGwpLCBmbGQuTmFtZQ0KICAgICAgTmV4dA0KICAgRW5kIElmDQog +ICByc3QuQ2xvc2UNCg0KICAgU2V0IExvb2t1cFNxbFZhbHVlQ29sbGVjdGlvbiA9 +IFJlc3VsdHMNCg0KRW5kIEZ1bmN0aW9uDQo= + + 20231011081056 + data/ado/AdodbHandler.cls + + + ChmFile + 2011.01.18 + SVRTRgMAAABgAAAAAQAAAIfm644HDAAAEP0BfKp70BGeDACgySLm7BH9AXyqe9AR +ngwAoMki5uxgAAAAAAAAABgAAAAAAAAAeAAAAAAAAABUEAAAAAAAAMwQAAAAAAAA +/gEAAAAAAADeJQQAAAAAAAAAAAAAAAAASVRTUAEAAABUAAAACgAAAAAQAAACAAAA +AQAAAP////8AAAAAAAAAAP////8BAAAACQQAAGqSAl0uIdARnfkAoMki5uxUAAAA +////////////////UE1HTH8DAAAAAAAA//////////8BLwAAAAgvI0lEWEhEUgG/ +j2agAAgvI0lUQklUUwAAAAkvI1NUUklOR1MBwNUEqlAILyNTWVNURU0AgzahNggv +I1RPUElDUwG/r2adQAgvI1VSTFNUUgG/4zbxTggvI1VSTFRCTAG/zSaWEAkvI1dJ +TkRPV1MBuNIcgUwLLyRGSWZ0aU1haW4Bu6N5g+ttCS8kT0JKSU5TVAG7jl6VGxUv +JFdXQXNzb2NpYXRpdmVMaW5rcy8AAAAdLyRXV0Fzc29jaWF0aXZlTGlua3MvUHJv +cGVydHkBu45aBBEvJFdXS2V5d29yZExpbmtzLwAAABYvJFdXS2V5d29yZExpbmtz +L0JUcmVlAbjTaIKQTBUvJFdXS2V5d29yZExpbmtzL0RhdGEBuuQ0qQQULyRXV0tl +eXdvcmRMaW5rcy9NYXABu404gQIZLyRXV0tleXdvcmRMaW5rcy9Qcm9wZXJ0eQG7 +jjogDy9hbm5vdGF0ZWQuaHRtbAGHrCenNQkvYmNfcy5wbmcBrItehUEJL2J1Zy5o +dG1sAYXOLpdYIS9jbGFzc19hZG9kYl9oYW5kbGVyLW1lbWJlcnMuaHRtbAGM3SnA +LBkvY2xhc3NfYWRvZGJfaGFuZGxlci5odG1sAYq3S4KlXicvY2xhc3NfYXBwbGlj +YXRpb25faGFuZGxlci1tZW1iZXJzLmh0bWwBjskRtn8fL2NsYXNzX2FwcGxpY2F0 +aW9uX2hhbmRsZXIuaHRtbAGNnVWBqzwfL2NsYXNzX2Rhb19oYW5kbGVyLW1lbWJl +cnMuaHRtbAGRzynFcBcvY2xhc3NfZGFvX2hhbmRsZXIuaHRtbAGPgBCCzxkpL2Ns +YXNzX2RiX2Nvbm5lY3Rpb25faGFuZGxlci1tZW1iZXJzLmh0bWwBk/5nwHIhL2Ns +YXNzX2RiX2Nvbm5lY3Rpb25faGFuZGxlci5odG1sAZKVGYHpTiYvY2xhc3NfZGJf +Y29ubmVjdGlvbl9pbmZvLW1lbWJlcnMuaHRtbAGWk166Jx4vY2xhc3NfZGJfY29u +bmVjdGlvbl9pbmZvLmh0bWwBlL9ZgdQFKS9jbGFzc19kYl9jb25uZWN0aW9uX21h +bmFnZXItbWVtYmVycy5odG1sAZeKd58AIS9jbGFzc19kYl9jb25uZWN0aW9uX21h +bmFnZXIuaHRtbAGWzgW8ci4vY2xhc3NfZm9ybV9fZnJtX2NvbmZpZ19fX2RfYl9t +X3MtbWVtYmVycy5odG1sAZfGX5h6Ji9jbGFzc19mb3JtX19mcm1fY29uZmlnX19f +ZF9iX21fcy5odG1sAZepd5xoIC9jbGFzc19vZGJjX2hhbmRsZXItbWVtYmVycy5o +dG1sAZvTGeAWGC9jbGFzc19vZGJjX2hhbmRsZXIuaHRtbAGX31mD80ApL2NsYXNz +X3dpbl9hcGlfc2hvcnRjdXRfbWVudS1tZW1iZXJzLmh0bWwBnPU1nkghL2NsYXNz +X3dpbl9hcGlfc2hvcnRjdXRfbWVudS5odG1sAZyzL8IGDS9jbGFzc2VzLmh0bWwB +h9NcqywLL2Nsb3NlZC5wbmcBrJIVfgwvZG94eWdlbi5jc3MBt/Qv3W0ML2RveHln +ZW4ucG5nAbPQH55mDy9mdW5jdGlvbnMuaHRtbAGH/wiBkAIUL2Z1bmN0aW9uc19m +dW5jLmh0bWwBiY8KgY12FC9mdW5jdGlvbnNfcmVsYS5odG1sAYqdAJpLEi9ncmFw +aF9sZWdlbmQuaHRtbAGrykexFREvZ3JhcGhfbGVnZW5kLnBuZwG3hibuCREvZ3Jv +dXBfX2Jhc2UuaHRtbAGG4Fq0UxkvZ3JvdXBfX2dycF9jb2RlX2xpYi5odG1sAYaq +JbY1Fy9ncm91cF9fZ3JwX3dpemFyZC5odG1sAYXmBsQfCi9pbmRleC5oaGMBrJMT +zyUKL2luZGV4LmhoawGs4jiErxILL2luZGV4Lmh0bWwBhP43lyUNL21vZHVsZXMu +aHRtbAGHlS2WeiovbmFtZXNwYWNlX19fYWNjZXNzX2NvZGVfbGliX19saWNlbnNl +Lmh0bWwBncVcqholL25hbWVzcGFjZV9fY29uZmlnX19fYXBwbGljYXRpb24uaHRt +bAGd73afCiEvbmFtZXNwYWNlX19pbml0X2FwcGxpY2F0aW9uLmh0bWwBno8ApUcZ +L25hbWVzcGFjZV9zcWxfdG9vbHMuaHRtbAGpgUPLNRkvbmFtZXNwYWNlZGVmX2ds +b2JhbC5odG1sAZ60R6MOIy9uYW1lc3BhY2VkZWZfZ2xvYmFsX19fZF9iX21fcy5o +dG1sAZ7XVbIEFi9uYW1lc3BhY2VtZW1iZXJzLmh0bWwBqcx48wAbL25hbWVzcGFj +ZW1lbWJlcnNfZW51bS5odG1sAautQJ0HGy9uYW1lc3BhY2VtZW1iZXJzX2Z1bmMu +aHRtbAGqv3jtSBgvbmFtZXNwYWNlbW9kX2FfZF9vLmh0bWwBn8ZxgbIZHi9uYW1l +c3BhY2Vtb2RfYXBwbGljYXRpb24uaHRtbAGg+QrCVBgvbmFtZXNwYWNlbW9kX2Rf +YV9vLmh0bWwBobtegYQQIC9uYW1lc3BhY2Vtb2RfZGJfY29ubmVjdGlvbi5odG1s +AaK/bsFpIC9uYW1lc3BhY2Vtb2RfZXJyb3JfaGFuZGxlci5odG1sAaOBV+4XGC9u +YW1lc3BhY2Vtb2RfZmlsZXMuaHRtbAGj726B4gsaL25hbWVzcGFjZW1vZF9vX2Rf +Yl9jLmh0bWwBpdF54SogL25hbWVzcGFjZW1vZF9zX3FfbF9fX3Rvb2xzLmh0bWwB +prMjyWUcL25hbWVzcGFjZW1vZF93aW5fYV9wX2kuaHRtbAGm/QjXayYvbmFtZXNw +YWNlbW9kX3dpbl9hX3BfaV9fX2hhbmRsZXMuaHRtbAGn1HPVGyUvbmFtZXNwYWNl +bW9kX3dpbl9hX3BfaV9fX2xheW91dC5odG1sAaiqDtc1EC9uYW1lc3BhY2VzLmh0 +bWwBnZN9sV8KL25hdl9mLnBuZwGsij+BHwovbmF2X2gucG5nAayJXmEeL05ldWVf +VmVyYmluZHVuZ19lcnN0ZWxsZW4ucG5nAbTeF7EUJi9OZXVlX1ZlcmJpbmR1bmdf +ZXJzdGVsbGVuX0VpbmdhYmUucG5nAbWPK+4VCS9vcGVuLnBuZwGskR92Cy9wYWdl +cy5odG1sAYWVXJZsRC9zdHJ1Y3RkZWZfZ2xvYmFsX19fZF9iX21fc18xXzFfZGJt +c19jb25uZWN0aW9uX3N0cmluZ3MtbWVtYmVycy5odG1sAZ+rG5tWPC9zdHJ1Y3Rk +ZWZfZ2xvYmFsX19fZF9iX21fc18xXzFfZGJtc19jb25uZWN0aW9uX3N0cmluZ3Mu +aHRtbAGfiVmhQgovdGFiX2EucG5nAayEI4EMCi90YWJfYi5wbmcBrIUvgTIKL3Rh +Yl9oLnBuZwGshmGBQAovdGFiX3MucG5nAayIIYE9Dy9UYWJBbmxlZ2VuLnBuZwGz +7wXvEgkvdGFicy5jc3MBq/tciEcKL3RvZG8uaHRtbAGFrEihZiAvVmVyYmluZHVu +Z3NkYXRlbl9laW5zdGVsbGVuLnBuZwG1/UCBiGYPL3dpemFyZGZvcm0ucG5nAbGR +SoK+VRQ6OkRhdGFTcGFjZS9OYW1lTGlzdAAAPCg6OkRhdGFTcGFjZS9TdG9yYWdl +L01TQ29tcHJlc3NlZC9Db250ZW50AKRskIUmLDo6RGF0YVNwYWNlL1N0b3JhZ2Uv +TVNDb21wcmVzc2VkL0NvbnRyb2xEYXRhAGocKTo6RGF0YVNwYWNlL1N0b3JhZ2Uv +TVNDb21wcmVzc2VkL1NwYW5JbmZvAGIILzo6RGF0YVNwYWNlL1N0b3JhZ2UvTVND +b21wcmVzc2VkL1RyYW5zZm9ybS9MaXN0ADwmXzo6RGF0YVNwYWNlL1N0b3JhZ2Uv +TVNDb21wcmVzc2VkL1RyYW5zZm9ybS97N0ZDMjg5NDAtOUQzMS0xMUQwLTlCMjct +MDBBMEM5MUU5QzdDfS9JbnN0YW5jZURhdGEvAAAAaTo6RGF0YVNwYWNlL1N0b3Jh +Z2UvTVNDb21wcmVzc2VkL1RyYW5zZm9ybS97N0ZDMjg5NDAtOUQzMS0xMUQwLTlC +MjctMDBBMEM5MUU5QzdDfS9JbnN0YW5jZURhdGEvUmVzZXRUYWJsZQCBBoIwAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACwt0ChsKWwnRCA0I +WgevBuoFgwX/BJUE4gMCAzcCiQENAY4APgBkAB4AAgAMAFUAbgBjAG8AbQBwAHIA +ZQBzAHMAZQBkAAAADABNAFMAQwBvAG0AcAByAGUAcwBzAGUAZAAAAHsANwBGAEMA +MgA4ADkANAAwAC0AOQBEADMAMQAtADEAMQBEADAA1D8QAAAAAAAGAAAATFpYQwIA +AAACAAAAAgAAAAEAAAAAAAAAAgAAACEAAAAIAAAAKAAAANQ/EAAAAAAApgIEAAAA +AAAAgAAAAAAAAAAAAAAAAAAAkhAAAAAAAADuGwAAAAAAABwxAAAAAAAAmD4AAAAA +AABqUQAAAAAAAMhcAAAAAAAAvHAAAAAAAAAIegAAAAAAABqLAAAAAAAAbJQAAAAA +AAByqQAAAAAAADSuAAAAAAAAWL8AAAAAAADQyQAAAAAAAA7fAAAAAAAARucAAAAA +AADM+wAAAAAAAMQFAQAAAAAAbhkBAAAAAACaJAEAAAAAAIo4AQAAAAAAkEQBAAAA +AABAXAEAAAAAALZnAQAAAAAAeKwBAAAAAABQIwIAAAAAADyhAgAAAAAASBkDAAAA +AAAgMgMAAAAAAL5dAwAAAAAA9rgDAAAAAAAq7gMAAAAAAAMAAAAKAAQAhQc2TQkA +FgBISEEgVmVyc2lvbiA0Ljc0Ljg3MDIABAAkAAcEAAAAAAAAAQAAAAEAAAAAAAAA +XA/rjle3ywEAAAAAAAAAAAIACwBpbmRleC5odG1sAAMAFwBEQk1TIENvbm5lY3Rp +b24gV2l6YXJkAAYAFQBkYm1zY29ubmVjdGlvbndpemFyZAAFAAUAbWFpbgAHAAQA +G9f/GAwABAAAAAAADQAAEFQjU03Yi8wCAQAAAOwAAAAAAAAA/////wAAAAAAAAAA +////////////////////////////////ShUAAP////8AAAAAAQAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA +AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPAAQAAAAAABAQAgAAADND +QDQAAG9lXpRxAZDPP3nu9yzkLGEnsiQzJ1JMYwJI+5/crG6bu9Xbut+PwPcIzwjA +AADNzBkRAYAvQJWElgAQ5FeLyYQy4U14SIixMbYBDHgAggDJth2lJMGJxLr7Axpj +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 +tcnbSZHEghvaT/KGI3kSGtcfrAPoRoPPR7bZfp8kjz5PB/6b1Gv+DgEK2avXXlnr +Y6H5ZpK/9skaF4PLv9iXJba20oU0byN/QLoaHpMAOox23UTJl2CrDauJi2FSQ1B2 +0nEe0N4GY6N7CnZV7E0F0o22hoMwvMr707zPuHUtyJzbpEVFVRC/M6rlSCqa8POc +vy4ugAnjuGaNDF42lZrwW7yq/Zpbci9RTNRwms90tJ9JVjWXDddXugqBIETfNmFs +cznXkTT42fm3jJVfF4kXZ7R7LVWM776PIGWpGtnJwJ+/dke+yEgFluVmlLXbM8y3 +j647AV0slBqp5y+aoWM77xvu31h1yWQIZgbic/HqUUt1U+UCzl22ZlPQgbmLjxgG +CEcrQDUGQmkKnMLSADYIxaZVYRCSxZpzBHW45vd7X/FfA5MT0eAvxdYmAHdDrqf7 +k91ex7umwMzkJ/7yCbPBICxEmZgITsjhkigoR4wggQQIhwERTnMnohge/NlzV0L/ +ye1HHhf/HCLlkUH9OJwSQ6MIWiyBSDmOrGNTDHSJtIyCKBKOnsqhXZOsfgUCGUEM +1XI0SywtM9lPBbRJVQK0V3+1t/hGNOzUMZzox+qeMskc4rmbAl2LVhUm1e+rzJY4 +p1/MXePWV+u256GAOqnDud2GkyoY3eNtLd70Xz+PvQhJfDH1VjCw5ypU7WV2i15Z +mg6RZ5Xr6VqzWQlhWHab/HfX4Ch/m08+oHoMmtpkfq3JI/ER+GTJktS7S47SkTEL +KjESPZ55qxp0vEhLqMZAiTxaVM5EvCRklWrvgqTSO5x6Ii+NCQpJD+swvpRNFZUk +WOB+JjZeL0LvErw9uhwXILUqTnaMOBRYClZV6U3Ml1doURfzw08f0qppcOxzbmv8 +O++7H+hezb90nMOYzn6/8/rL7281S9biiiY7QNMHByty9JV1l7MGVvlvO05OB6Rh +ATJLWJlGr/4FOqRusw1tBuO09RJpqyZp5WXF1zIKotUQiKylUFiIJKJdo4MNCKCc +WMxSWdfpN9V4IKO1r/j9M1EeuUt5tN0frjwc8/+RW/1nXG6vpun8g14rDu/31zF4 +bOH88XQ9VrsEuuUMe/NcA7d8LgeFiC+XtcTw9fjacRobcfkFIglXNgYLGNDr7/Tk +jqCFNs0cUZysmChkenALMrq7m0bZxBaOyJb4U2J8UwVFiCj8AALmIVDtWUGkw1oQ +iEE48TL2S573h83xV+xf2EC12lZcPptvqymx4dvqabeMSVfGVWev+di1+VlVm8/Y ++l95K7DYSfPYK4augNJqNqddo+BLRp2vNNdBNDcQUocChaq1usT3gXVB6H2hdoiK +v47a6Xzzfd+XTVXJ/35OXYEG1wH0dVy5SKZSDE6oInasZNX0wFT3flVblVGgt3wo +DtUv26rgat60fCIP1yTjCVWJxpi1ZgtO/1Gq6KlvIT5zk282yf2s5h7P+z0Iqe6M +HbBf7z28easS668VNypxsjpzotqV7V5Z70Xx6PcW4QFmdPibjR+uLh3kU+nXH2TV +D9UNEfu590bxe1mgBUjNO4y53K2vt/u8dl/+i7rJZWL4Wd5gNhIi7eJUrBI2O+vN +o95UaE1y/96xp9QWmvFelF7hn6Y+Y973rlNZKuT4dmtTHSVrdOVJ9MVWXrW70Xfx +JseftCKuO88P093qlux+5duIRdR14R8Yecfl6wHvyp9P92u5OtIktoi3ijrqIlPp +64qF2VcX8UUzvuRvKv6vPu+srO8H7nbudHTeeOSrUHVbTKe3ry4KOHwvrd5IfNSQ +HC3sFLMOBR5G2++8vdEMhdxZf6afDx2r+t23FXs5XfwRfxGj3bjDQjhKkvTzYVpa +m0VvRV9cB1afgBoibilyzWXrEOx5sdhLx3OLOhlyK5fc4+InUyAb50ewFeyia8h/ +lLcUSrvh9ezMa7e3TX0xnOli0q/07YHbtS7d7S19UH4tyjpbRMj7KuA7+O7MYfD/ +DbKLgfOeKVtn/3d+GZJgMGvaIRFifGTPHqgdUcqioPfMap6IDS2dnChbm0Tt1fhn +ad9S3F+Y3b54885cLzWMunDafWPd30OVu4TcVOnSOtJ/sshvAruoe5683JrGsxnB +bWpFN/bkIzhfLdcYtTKxZrfqp9xJcvEOHWfgjP2HixZu1L7bK55zRILA7iCfe5r+ +KMmFvyX50MqQHq04aQrnrmn2UWrBK3Fb4Al8PH2voGZb9UB6WAY109KNFr/vTNs/ +qwrtSIIqZKzvLEpbMf7qd8dv2r1NcRDJvfHfK/NgSi3HFVgacLaGlVSstTSHHAqk +6QF+f3uVdvNLPsFucoYJ4ftawVW9YhYN/ZaqOR9RDd5mUFe0/nQQj5alLAD3kbxj +ukRc0ohcLbmyKWPx8+GG+Pcr0sQoVMrZKz7ZhpK/wd7yhd3snLAjo7WZxWONVv5k +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 +sDIBAl2a1tcnx4AJHWjdW5uH3tEtQ5bJzCWo7heby1TtiNaN168ls66ywvV6uNVN +dRokRBXku8pNjUYd8QXIPQttU7ZVPVM9p3PieTnzk+8vP2hsw5oBlPwOrSbPhqPe +Vpl40YWaVN3F2DY3p6Ni/8Fya1nfFElVnN1NO1GLXHP0rKOSbAeYSZPe/byJrtgk +0nwe/6TmGT43dimzcLBRJjzZclMhPJwcWRPWN1L2A0UPYeNbrMUimed2WVqitmTb +DA9nDfPxj3Wy5D9EHH58oHVz4lXcIFVNPJts60STbN4wBMmewJnUGtEHhzx7hNHI +jQzH4cazNOy9s1UBL3ks9vCnFcswX6P7VKhaix0Xw8UKh7KCR1ZmzuHiRlhivVaN +xYlz4jlO8kVKytfhFy1P3zTESVzUloNTHiHTT2QTerHKDaCDIuwC+YWRNKKR6UnZ +EShSCUmzT/4mCh8xWnJWZp6SKaSpcpVZuCHnH+Cytag6kulwLkzuaIhysbSdSZOY +pv4Xpkgky3LtsfUYiHhU/IrE3XoPTKbLRwzm2UbE2EnFlYilcF5rQdo492e4Mdna +3bm1drpqO63LiRrYXEWlhP957eaQtZZqR7Lmq+8Uds6dqUNopWIKk2aYDfEPfavY +1JiOLAenSkpy1T2bNpolu1TsZ2zduL3vOTVP7SZm9kOom0dFh6gMZ2syWS6/8ybk +D+g2wifRlLi9XBlUueAy5U4arVjtq/ekp+eQKXLXLMfHcnIsLMfHcqszX/7yrfx1 +5auqM9IEM6awGRY8y6pz+EmXpqA82n79DMQsjmFwi6GTXAlaAYN5BRCDhcJ4CX9C +cuspuY/sYed+6bqlj/9nw61yb6OVW9pZTcqfTu89/5OkmUjVlr3rSVv5Zm3ZJtjj +QBQxiBd3nxGMAAwL+SMYrSUY8QJ+EGP7Jt3i+dCLqnXbSaQzVKmXSdcT6Xca3tJF +b8N4+pqI/m8XP/KOiIsoWVUmy21//rJsEpjDxFzrhkkVAkFsFMbeccpRFxT/nNL2 +g39OcZ670TKWIqeC/HUeFFYUKBYwYhA+gYLpzJD7ZEHuioF8hZeXthwNpwVJ835Q +lsmJussEuPyzbcDP8RE4Fi6jlSS74AwIQrDiBlbwyDXblXYAeNIdiVa7l2phRVW1 +eOMhNv0u6q/KQqmabXvB9yemrku5LSAByrsW8V4T5rVQpFSkXZlLzQyPLx1bo1T0 +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 +CLPQ4zmz/QnIqmKWtHtjz+jP1NQj0baMHeV5Ykl5gfeXV6Q2khDnmbpxupe+G/LX +QgNL6qtSiSjPVrUBuC9qLtrJ3EkYXaFyfuW6EObR1Dp+q0hUxfEaooWI1XQ/DgbX +9QSL1KOjnfuTv3aYcigT0/c4glV54m46T0jKl2E3OKgZiDtY3/dj1zgfmYD5iLFt +Z5qItyEismmF+t8Z8VRe35EVA60JVw3559pm+6zVxy5vENNESrHIb/F2GAjFvnB5 +QQW8fLvl+rxuQEHwS7s98Phe39C5Knwn8rlwLZppmMiFsssefJF8kZRtwqChk7s7 +iHuMmo0UvHEP2m86fohowfT5H8t/1Rw0TlHDveYu3vBaWB6EgzqJgz+45KvoKuZ2 +B3OnDVU2eIYesBQHdCcL0J2PcxJV31Mwhsf8NX8h9IsYKithtFvHE15006bbbrYa +7YmcIJQa2XnM4mC59027KOqNfuajou1or9TZAUbZs/BMVpg3huy09huun3yGfBq+ +64yIrYOGrdpz9h4Pihepb1jbsjLcWImu3XqaiHtJhum7c3o8bf73uRvGnw9rHqZa +kz2TZ8FX8F0MqDExrZgabrKmqhSqk9RZqa8Y7pB57DdZvQrEpUk9nRo9gJGRRDnR +giWjgBpW7mAOdFa0ChWoV8iqMsKmyRP8oZ5g8F8R/gHFz5TD242H5D+YBR98/N0j +j18vyiqKa9HvRpHkD816/+wB2sTcYxjsUTujQkwQHRqj4dIe44533fLsHtcDCEMk +T/jG9jmUJGT4NIFooeU0oFVyY+DH4zxUbeYwc+aU51f/XvnjvfCPoXubtGnHPVoq +klY+1L2JXJvmq3vd3C+6IOiTrONidWIsLAth5eEoIUmWEQIYRIaMchI5R1C+Rj3M +pszmf7gusqDmk6zjVZH9epR0A6sLuuVI2Y7SqqqRsPpr2d7Se/rNPH+hWOVzHslO +LXpclwx3i/Aov1I0YK8Oi3WId7CxJBAuSV1x9JHWnuhVBGVFxHowBVyV1i1HabHP +RHIz1i/PLsK0yc1+LP4gxPfZAU8ipJXjaEYuCJhiMxwJvtjWG6Hc1UQhCxf6IwA9 +idyv6gPpKR6NyNkIDKPpQbArm6UJCHqeMY9vTxz0jB9xctnet58U23DhFWcXxHqI +aZcu3+UJPszdI5lE7QbeZyfrrOZSgkPa3LFh86a5Z8jiIpv2N+d6+9UZM1z+a2Fe +P7WKZ1Vm4lzN/3hyGaWkyiIwkCkg5h/jPZUlJX/DMv4CreiEIGMDq5r3rdug6G23 +3x0ZOrjASPO7jaYD7Frg6AyyTmu9XYNnOvWvDQ+3x3KiecRorZx4jwM31BzvmIwk +U9Fhmgh9JxQ5Q2wHK48VzOJKD+x1ro1Okepl0ouvkYJN0GX+FTh5/EzOZmOc9YPY +QOg6ocgZ5pIfdadgLWxbo4AM9MxnH48r9HGH+S+cq4Mb5aEjY3YbyLuHpmPzMPrW +JhKBVHO+cSH5mqMQE4WCAm9oRbIfOax8OfvpISgIR+JeJOYOwtlO/NiKHVzhYhx1 +9tUxXaUrgk/Ul4fb+UMXVCELc1gO//bAX6rb0dIWQ1d1ltVhsfOMw5XS4j4grGlQ +Wd0VVCpF1OQG731Ppwb6wTYs2XdalYLt9MfdajabIk2rOXZftW+TZAahdFVHdZrR +o0HyFiwt79UE53UiNUC/847krhX5z1DgHmfMrmw+DwkP9mq5vNG4Oe0iA8Kbv0z5 +GSpHdARHeF1AQEBAQEB9QP/wtLwGx6e7/81WBiiHgr1gTayb7h8w5UN+qXcLa0uN +523ML2dt0pNpDJ6nIJHkAGKOATo4y4DTnWNY2UZnpg6RwVsS7qkUfD8bN9XPB0r6 +dIyYQzPB/QynbtKfuqktSGjmOm1kZjqGzd02TSdL7JC1MjUVLxlQj8rq5dPdqacZ +B83zZF0Xe+DexZpda/hLmQhqzi35ZKwIw1482MPHp7ll2FkuDHIvaxXq3noHkk6/ +NqFVwcP6K57ij0czOBGRkfEkVZAHYhFJ3Wuss4BBJxmf/KUopNLj2Dlc9ZP+S5iD +j9Bk0x0qjBlZ1nHLy9vbabZ6krUzUh/F25E6iD3Z0mHs7aoYKxpN1Vycxs4hl1PR +pxbVT0Y2uAu1gqvptBcyRmEF+c6ox+L33Cd06iWQviPnsKQfsZQBxQZrJynVZr2c +YdJ4G+NeZ7df5KvSSYOF2isiM3iDmz33xwRX2zPPWfUek/1pGFtRRL188UP3Zglp +ZZmNFjmH36AnN0RWxhLz2z/ipmWRVlI+9nJPoXcG2OmkHJDyUUmE8H9vpBLDX5H/ +v0O0x6K5Z37EdMqIJ2hbwvbnMF145MLZbFns3RQwN7RgY2L2RFbu1HIwistJSoNJ +tPPqC6E73pVfmVt+zldFXSsNrm+f2X7v57w8HZTxc/N+4AIbXOJt0KZjNXmOCUKv +/jo1Pivy0yYP/Hzn6Ezg2O98Oaegv0KG/zMkx9BzOxw6kmV5GWnbAnkHfaSIjglK +P/dZj3Y9tn+Vsnrrnq5HWaftS6fdLg2Db6CbxbpXa63QvWuey8QZ9qtcJvW1PYDu +n5M7V4mp/OmpZ93ctNNz9fQwY2V65wTGdKVPHxP38kq35MpYZfI6MERlEewPRs58 +dqVSA/c8TTzKy3VB3s8TERZvJPqtLLVmvPA5Y9JSe71Z18GiEKgdr0i5u6fufbtC +UR8N3ez3JUGmfuUdXrn8QtHv4PHgDovn0MnRPVmjn/U+GGM/2l5oh/SfhglcoWkh +m976lu8Y0jOMnA9bVIlboHbv1KK19vS+3Z+qWzq39lBXVpTuBe0zP7C7/lWtgq31 +SC4Uu70lHxFpPB6Hy85GePW8rri9egFp96t9ZBd7RSOSyfx/y0CmbQjUmY/ms7mN +Iyuc8dBOJhbZWziPc5wLBzN3zj8txWa61WuQ8kZL1yJF7exq0t+Bzoll3HsRAwAt +N70iMYuuJnzVTay2sU5ZWkTjkJgGzUUn6IqOvMguxfqxrauvKrYWzMVhcGLbQgeE ++Iq71S0EQMBAQEBAQEDDdUxilR8gciG3asMxmjDIg2HXwDyVk4mz5KMn3CcEEvV+ +4xSrdP1z5rJsFz2kSBJHCu2N9ZwufJPqCbcGHXyGQmcAuY3UIXIVqA3AV0kaJNeW +DS2rSwaX9aXDywpTAeaNqRBzytSQuWlq0Fw1NWqumxo2V9HBmEg0JTG4Hpd8UY3Z +TCa2Fnb8QZYE66677Pvmjw0dXk3MoN+5a1sJ+3p1dAXl+UxPdqL9Lijrr3Y+WRW+ +1q12geZ//zRPuGD7vd5Jzaa3Ve4fH3yB+ikedjReWSILNVWfnPuKNxlyqhzy8xpN +Lzyc0yUtAcmkiKYTcObDA5VqK97T/8g200QZDQRiMBb6vvvCkY5eCmYJYSIQQz6y +s2YhIJL/95jUwf9h8OypGrGkHkZn/u+lvJ99/4VweRasJytY0pghBwANZco0L3b9 +Ye0u6yCEoAnjaJiMhdABrNDuVB4pJUiqFKdysHHUo8hmkGrOdBf4fpItts57ilSm +tRg0MeNzbg9AwdIUcJNTclFETdEWJBZoMiTCBrFqPd+rLREQHqWhXsiXz169JtQz +VKQ5td35w7Q9Dc4w3BsTqyjT/scxIR7hvkiGhqcgZ2ef/HCGlhsWWdhNg7aKj/aa +TV4tTuxYRkpaDCsoESnPaeL3EFd2edIoY12ybsymekC2cAuBGruVBYcsX5bjSDHW +RVsRRG1iHXodXqti8NjAobSSLvESyaNTFsTPtrlmMqcElub9NRBWiWOxpojFGnuG +iucej/Y43yYUyC6YtXWnagUZAmnKwqBJFzU0/DuwowR10tWZkOgJSEJSrDLMpMBZ +grLoqvq+RhxiNRQpIHS55ETWrxwd75dmeCxSE6Z9ZYFT4iMlPE5I0ef3Ah4YCmHy +JnWrJsnxB9IkyX5Ak/yprOj3IFdkFgFXqwpHw7sZhbFVu/kp3hNa6+dXJTtyZIeY +yaQeiui846ZSAUHKjgc36+56/5g5u4VPL/It00w1pr0VpD0X0Com1J7jxTDkij+W +ES2o7StFhDiISjLllQZrGOsjHnzKogxX/mhF+oqhpIMFJhKx+a9Oygp7RWRCTCNT +OEpHvkmdRc+p2MFaYJLyMLmKPbkxYlsUk3qPoxBvBPqPdD3WlJeKTk9fv1jEEy9F +cIskSmxbummOBNh+yfRpGB5kxij/EETORpJVXwYuCXzMuWPtkWr0tY0QgYwUnTKT +4UzH/9L2+IhPQ5I0GRYMG+GOJBvJpUgprezagsAVRI9K1I+WP+nBgixsNKmAs6Yo +tOiuToYYmmIjlywCYOSNU9/n3zuJuLUQqP4WX1L/CWQRO8diCI8x5aBjp2+HkLgP +HWhXD2SV0VdMUI1dj4d88me9R72ddXko8hIIIieHUZ+Iq5ELRK6mLPA7IXn41kZT +EjFIhwqDlnOJThYDYA9hIX9S8HLhcP58DXOB5E9dFCVIBsbyiSzUdc4mTNN0BxXy +85gEjisJhzO2yUILE/5SXBUI013xMLVMSdc9PrAz01xJhZgCZIfuCnWwloYp/W0C +aoQ/ucmBeBKXDrDV7ssCF+AbSKd4tu3Cpx055wzo9dlibaTXb71Ot6ty1Mjx1PVC +M3VMCeKwIQVJIyeWUwFzZdFSSRQNptJiJdH5KJu6sNsIpCNIYN7VtBNO2eYlC9KF +UyAki9LCaRR0o+XT1yRhJCKeH5POY8Fu4rUb4FdkTpqi6J6EQjp6mgphBjFYkCYP +Bu4/5ZnHXqR3TJsm2LyEGUJP96JaWNZEBlfB9BnRcWTPtMqaN50U5hodRNEtuZKz +qAS7d3aAkZ3pYIFm7V5KevJr7oGpWcfxgBDH6DkrXBeHiN1XU7qb29ZZmyaKIiVh +ETkM7tNWF4ayeYLWMcpRXxqd/mhkz6jJPCd9WXPzqLQRSYAej3GFFMOWHI1F02Q4 +5iQ4j6aJJ1hCIaCZCn4F4JCRlbm2ZKjXOdxLyA4mKUoqDPJCAamBQJAIKatLc5ax +bkYbdEpNILlrs2305iLgLKC7YLApGBSEBnopihjj3zTDcBRWjmbrPiRxmX+zEzkn +sFQjAP4uvH/oqeDuwUAcSkninXYigiCHhnIdAtasLdc/C+1ojb+j7Q/5iW/779/I +KFpP0MriYrZKqC6LQ7wkoTBM0bEBmwuShyFOHIeh2vMPXwkgKL1FGQTdlLpm9ASC +6Ip3PIv7Nhc1G0PKOJ0Xk7YNUa51pwkUm/rqlBZOjJPaS9V73neNPghzJaeEF49R +ZZKyspvQIpjFWFASVgyMkuMy3QHsOaMZqcwR7BmtlDuhNjXvzrw/lvrFRrRZSHci +C22wHhK49vv6fJTjUm80cFFc6JN2vDb4lvgxaQtdl/MVF9EE//mdZJuIpEcDKRTb +/yTX1TcdYEnIIfVnLfM2x7sb4e6v3wo+K27aDXD/m+5Ffle2ug9cR7k2Rmnpp3AT +bg1jUGRcxWGwydmCuUUs8xEWm0gd8WUsjHJpLLpM9Ws9jDqm/m6KW9QuSW6mzlJW +WrOVnzdTvM/EScAxWTxucyaA4yD4p81S6VjXTTaNJ9A5k/z22CuUOa+UJ/Zrymgw +Q7d2lQ7o0fD3GMFol7SYiNzzwEgpU8ecTbUURb86kZSa5IBF7LkJJTzmZ1SyqLCJ +R7oBUzZdku+5ZTwsXMnSjNbZC5yXq5wFRWHh1FU7naiAJsXDw1QBRXrzxsMkApUi +pN/RRFJNdidFLcv1ysIrdnvbUxzWiOu/cHb7vRlvauXrtFazodNyy6pfdBMiBidI +INB4DNHuGkQ1/msoU++weWFXwFzKLN+cG1hmENrzpVlzeq9KyyFAEGWoqCSLg4Ev +Jz892Bq8FVUUXHTyEBOMoQy9v6vNVW+m4jOKBdFhic2aj9z8TszBfFnTjvH8S0vx +LLwdQliuMdc4C4vIZ+0J0znVvKElzq6yFmSIXnwOzBQ41ETO6ZAigAlLJyOymHod +w0E0lZuMOZ6+EUCIOmb3MaF+T/Od+rWoBQacs07ByxT5DND97icoyfHbET0BiAv6 +9A3rXrplgmPWV+PXAMvossvnpB2mea6QiiOghaADxUKbgxZ92boBbtBi7UusHuPn +BT3Xk+moYo5PJwByLdIWt0KHjQC5DIApiwvFtjyRVuSqKz+z05xlHBaFJkIXAUo6 +Yfw1krSuaK4nFj+/69umuEx+xvZplJt9btukQgJyDOiLAQMl1OKmEFq+NdczC6B/ +8L0DbupI2XYUkWZSCOsXDy56g9HJ188TRKCKzto1k12xCwWiHJm+h2J/Ms9Y7D4a ++RxDwhf7YC4kgkV0BA7DWflNbWcwHz/cEmcO7t+98ZT9TfadzGXtITgHt+s+hiPY +E/h7e57Mj5p6RIbzI5k2C/m5cVj86pUXDDW4TYh0C4o5PDicAg6/y//1Fo2neeCP +lDqbjVRM03LmyOSOLEWRdA7S4hTl55Kk7SElz6YRJpWmFWCqkxnXRpTaJcqxJaeZ +d5GXL0UUdiXOIK1Bn2Sl0RqhFkk0x83AKsjCVWVrAoOQHbd6CZ4l9HkZj5M0OYJi +exGGFoLo1hzET9vJBhnN1cqCc48veJ4uPQFP5UjRLI2UNk7w9zmgfBTvvtsJWTS4 +3ziM8twZVka/E0NXmwFnafsZ+yqOT/gpFIYhZx9DnW5zFVt/5LKTkslIwr9gvAzh +NezeC9ZWHEYOxOxwADVNtWGoFMzHSxg6YEICggICAgICAgIC7AN74eXSmwXAaEBA +/n9PSooLcD6rgweEQEBAQEBAQEBAQHh8E18/ZYRZNs08EVGzZEwgy2DXJlMlkqAl +rBjZIAFBAQEBAeMBCAgICAgICAgICAgIoQ0BAQjgCAgAD0BAQEBAQEBAQEBAQMN4 +Yf+adhvqaCNs/kcshiuyGKweED/vIhIFHRCb+Jhq+2eSZr9WVgARP9k+vK6AFEBA +QEBAQLxeGvjO+wN6JKndc+NJnVcFCMnU/xqNwvfiCpqH/48yfx42r/pUaJhazYc6 +v23cOevfB8OuJ9roiWpZ+xb1xlFAmlJX1bJ+tTvDzWdGQwr2qobpr/XRUL2QnVc2 +beybJFZfde41sHSK89jXrOa9Wye9R/7qku+TuNXzEp3REWh3BU+LlS05xNX8Djux +t1kLhNjdSUn6G82ZlruTzztNB36bMzZj6bnaB9RiVvACr6/t2HEx/KrUTRXNlEW1 +9L5cLoVEW39ZfD63jzoS0eYKGYN8Iv8ur1XobaHi3/gVbMM+nYbD1X+7x2Bl8IwA +nD3LsrHmEoyZAJj/XZLi8NqPNkNXuPp/oinPrAaZlJdDFCenUqAbDyUZX+yh09jB +ullMhTZ+hfvH4MFYNrayDFqoBnzDv3agGNkZOyW4xfFdEPmfq61cW65zymgtOtu3 +MnbjNlWoaDM4v59y2gwp+SfJxmPuwqcHF2N93cnL1vMrbGgqsIcba951u239PyO7 +duDVM1kTuQwQB/F27tG7bfvVcsnUq+tuTJGDlONhAjFrf0JfAk7iW9k/q2+fV/G9 +vCOkLxk0lNDOiU+PJwseiPVeHxxE3Prf8A6bdO85esm62vqW61p6qJM7ORovfJJe +9ZeUEwgkwsI5kAJCfHn9AFE5YJyThiHnObnGo1/WTf7e1Xpe9ka6kQ3fWKpcA+Jb +mkfNh1AfAekcedYThDX4/7x6I4teoWSE9nsTQja4sjluINHaPWGXcmqfOaxPLVDs +RN/sCV+eVhUTX+QE9/Ue/Ybgqjcmu/Ie5UH/5Z4xXtMu1eydy+dES3is/U6XEHRQ +jAIPAoCr6mo7rDVYJHbW5YT+sKr9MVDK+LZxObyYkHoDFy/YDJcCDMZu4gZAR7CD +Zjj7kWGVov1OGZ06R0N6ks4VvP22Vpx1eWWc2gaGMBcmaHLTHuxPlLPCkV3NejNu +bFKJeCV/URaps2rWJNKr1oLTNMWtdhFGo52gbVeXP17ZpEiZFh2NYV2F9hZgaIl+ ++Lup+FHADrWMctf5eqP81N9rOmbhXVTvr+4r3GwBoYlYWVvAH2YAEX3n9ynf0rws +K1EH5xF85KYa5ufhshcGYInPcr5wy9pI5pP0A13R2T0waYCHdfRn3b0sI4K3VhD8 +3W+GH61CakOemG9924HQf2wteHH9zYs3T3nuV3RzSaR1rveYXR4vm/DT/Izstc23 +7Dc9t2gH4SHsED8wuWCMDw1zMdYzD+BKN/xydbnhl385tPDlhGlQR+yHDJGqtrow +JMUVr1jTdTVucfdyWjqGxW5H/fzbznUCTBGx1SwecwFlTQHgHC5XNC+lJxgj9/J/ +nx9PcPHoum/Jn0Kr6r2Cn0aQGO1iUCu1flK/y9uKe1btscVjs1j791vH5UPdk3tR +qMjgF6zx4CFh0+fZ2Xnuf/vZbbWfNW47rXZupFzA4fOl4Jlc/NtZz3Zf9Zzev+eS +2r8O//kAsEMQ7ZHBrM31luuJimDWG43v7Ye9Ho/N8SeBOJf/Fu2jqnHOIjaMfGlR +mhwoKnQOgtOExtkaM1ys4VDyJnupCOoMzRRaQky1yv5gC6uJDfaIURAQBwAHACJC +VkUAAFoAVpSRhiRFHoQjVNVIe++732XZbbd2tbVq1as1Md3v7vvG7d7dzmvNbphA +/6hzClTVQklGQgNHGQd/UawYIaKD4uMqlylV/1FGUUH//sFcgFiNABERgBkUACwD +V4OygE9ueQEmPCDQoHVcjxsigSBit1AmZYCtWt1tWSuiTLJMXwGl7fY/R1DYvu2E +A7HLDuMalSqy09NEWq2u066o4zo+HiPJ4KabLkOUtYwvDjgAA2kRQRDgwCgBAMjQ +QI0dAGffTCgFtO09t+3Kkae3tBY7GirNLIQTdmBXRfbZ/upKiqJEAThASShJOknS +pNP0nUunTick+emXn0/4v6DxW1U2B7Xd8AxTrpztoDXaaup6rN0K3mCDNLQW7zht +vdml1eS8lM9bRnr7eIALWoyTohK5bWFm+JOGVlz/b94LN8iBr6P+tLPBai5+XEmU +1hDJzdtfSUMx51D/0IA1Tv+kd7lFO+eiqEAeXPXTzBxAcVbRs57Z+5w/ssB+07I2 +N/7Bf+Hfrnu2CW0Qv/8Or6xxs+owflsoXM7fNfOfK1j+nNpsGuka+tw043P3I9Vf +WG6xV6+Ce5gRLPaOrP6Z2wGPY+Hnelhz55A9NyGdYeLeK5LyTHz3zbRkLdqLlmIm +MdPLsvxfywq936U+8GZjDnPRqx5wwBITmNItHOSX+WI+G3fp9NXL/c0nPWMjrq8V +u3XztdIVLH6hxnPZ/rK6w9q9vG6xV0/HPnz7wvrBZi3H0b3jn/7vv7+76aW+L6qj +puRvmte85rz7sUWfp8e+6z9O3+Qst8slZCny+GSWyzY/j9m5Tj/zYpZ9peL9drLY +w85Lf8mleVqaZunO7M+3frQBOPQ4jrYynvmTK41P38T3sWteloO62G591nc+YMdc +18j3feum9zBWDezbeLFSHaZX4cT8rS8+7GpSb/jTr/781ucPDnvT1urIjf0V/3W3 +TT2to/ngt+RDHu0T7zaTR1v28Y70vN88LUX1c3UGr9y7t/t6MVU4cOaOdsvru37d +rb36ZOsy7OnTe/ss37bqlcx3N6ax8vsSDcdupy7YbBPd9KcG+JRvZ4Weuit23LnL +Tnyx0/a2D1mzZ74bf/yJV7/U0x+0bO0Xt//w5Sbb3it0y9t7GkxGnKv1tmqdrGOz +2WtW9WHAnfpY30zC7atcuHdX5NU7O/PW87kKX9LjVn605TvybbdtxbXqsuDWOxs3 ++8G3TYgTN+Gema83Ne4lG93iddQ309FtuOa/W+zMszJLNlO/TbO124bLm62tJ2vG +RJwwxsYa17Yn83kndeuhpy3fZp3xSnTJ39rJyh9wc4nGF22/D7/4h60yePGmm8r5 +bmLbHs4R1duqS9r27YYN/drvaWo77qXn+u1iTtjVynPcy1++eRct1RyUp6Rsa/JD +yVdn5Hsx9cZjt/649bJuqYW7V+twvM3WeHPytg+bt8E69yt3+8uPsk/99fO+/uHv +w/Vx9HvWmiGdnskpxZ39+4+jfvbXfsFtX+vVz03v1/3Z5H99tgtZ9ydLbcL7p+ce +ddC/2DGq+adt/M+bPXL/4mIyKtWnbuynBftLDruU+fMWDNTBY/5yTOO8bkvP9zZ+ +ydM53pGftN236oOPvfDYalbsgz/14zGac/1+jp5fmZdw5LIehGdwwDaOrp77ckvF +8twHvHZWiP997g/vTdkcbfOmxY87ZHe/5okOfazL6bR4Zy8eFNnqUONdS03vUJ0u +nJpW9ojNnfnNLmzA1vrZo0r2PmT0Lxd2LhlvNsEf5ziaUVT1hz62VSXaNSh3W8Oj +0u9dm2v/tmvccaO11Hrr9Rx2S97ZEfDK2/MNR9rbzvmKQy7o/TjSh3ddn6biKxbx +bLO44djxt+s0azKYj3qQT9z8jltg0/jt637omo/1fmZksb32GV9pxhf9zVW12qer +5z+c7UVH2D/1zb8dbBdy3+48t/1bcm3fuugR3hOOz/vNOfr0/3zabVIZ18bXkj0m +xs/vudVca+rbYZ3yO7+MNfLiIlzpqSzN77v0qYu3tyc31359h3pOazH1ue93j/h7 +fjfcczBjLF3E97FDMeTGXb7PTW2dd5zXNdVxH5dC11dMULpwm+XrlUt7qY/72qMu +lB8712++6icgv/44oxe+oBx3qQ1Wg5O/77mPetTGOiWvHt6LphVrzmGnK4dbyBG5 +BnTwYbX8C6/heSs7E1fx7x04Y/u397Ab6NV8LadPcr4fG+7jrrzW44RshvN34F/8 +2g92ZGxEppuRwd699z3ixSN9SEt2On7ae70n1At4OZdi3LjnNxvGE7BiHbd1W9+9 +bHq5L161eWXjkAa+7+3ddWOC7boNuX3C5ivxrfTO//5GYPnXox7bmH56dSca5umf +3hA3cofs2J7f99FxvvrYY3DjLfyN25dsvrxP/No9d9mWTITP/vSOm8abeuNH7zbu +1ethw1mzfjjjPw4NfzrugQ0ty/XDJfDapbrLzuRk4j0cGaFkot1slryEW9/peNhx +J27lcRkx+RNr3SeNPnwjE++tmxbVPmTGPfvYt3ty97Z+tL40hd2tpd/1Lobzi3V9 +rpMvx/Nstf2wm7vgZqxnozbqH/d1i/LGPvkTO2rYKD9GWVnmPHBhL+LI9JeGW8O/ +X09e/cXX32y2nRdrT87kpjenveny57bwC778ZNG9s65jt/l0i0/erQTt7caSO9nJ +S7dHN3nyg57aqm71jKM15MO9OqFl1fz4L7fft261UeOmnXW/79vf/H6oOyz1P9Of +N+pD7XjQ2w0x9OpmMbU9NYA7PekR17ts7d3ePrfPbxizK3vtrmc3veXY26zvFuON +vftX/+Se/ay/TN/EZ3P79jOf3Plft9nVHzKpif/yGQP5lFdfF1/3n8ocblrc9s60 +7/HwGq2bb9M51N7tzOd67Lf90Ncw2p3zBTfBetMbveITTr+6lOp73d3zuX/dwu/3 +q4F2cIaLBbxeNs9+zt1xXL+a9KCvHYkZwCk2bGvZ4/W2A95MbFobuO3lzqQr0Zh7 +NLxct5eu0kxlYBLdGdjub0LK7ZgV22Gje/10YmVesiVPt2XV0m9n25fOW+nn1cY2 +GJTxaa3dV97o4qvhpKV2+63UA724USj/1WesbknrL+fSnvzt+wZW+pjmZ0V8KPcZ +3yBuDlGfrP8Xbf6+dkWrLxmmZ9WL6aL29uPOolZagPleuU8bDU8tb7kOTW35cBet +0NLbS6ll6YOtGIVn/ZuEzM7ODX2YCdHy7ZvoDKFdDPRN8z/N7/kqKWjbdVwVlFox +gq2cYfLEm+39zvjGxXOzDen0orhYmjS2UWn1b9MSU9bjKuQ0ocpKi3lJQrVhUdhA +nk3a7H/LL5v37PxCvXyntaDtd6HKudXgnp7LoJe0ZHYr5RB4Q4PzNht8/6Plhorx +JBSh0HfOV8PE/VR1vF9uwWp+0mm55xB9Ly0YnsIDMQXiPJCC+5xlUcWj+7/TVNhf ++ksFR//azWkw6JQZ0zMEbn+ufoxDOY3KDuE8WwdlUZkblbCF3U0cjH/q8mrDZ+XB +vJsJVdn/zTPqk6LqDa+ZnZVyE2ttlYJBDh5qiiTeTs1qZQe8aqW4RmqfwTlftG+5 +E+Rpnp8tw2iS0Ks2867LYIR/Wz9xmp+XuYB2z5UXwFVL3j8Isz4B3uglsGd0fy0l +CtxFZmn4PTFomhUhzdrf976lVW3MFTMk6MDFRFnUxETRiAE9E5xS6ShIYP8+t55f +J6z59R7nBzO+CXh/Pe8b8rc0hfpKTc9PncITq3hyxllWaNccM/mvMDfS06FeRh1U +5auUN/FE52UCoPsa4yTSYJlliM9TM0R/m4tSGN9z32aeEWr6Hqfd8ma7KvvCs/KF +fxbxg2ti/gUtKapPDfc0O67iVRx9/uKvvRbpl69vfAfWc8U8LvkusRmN+0Au1Fl6 +k2hqA0gIX+SXeasWKA/CJnoOb4BzFBDfVwX+B0VH5Ketsj+LZkG9vAb2vClosR9q +f+L53ixp9E+oTM++0xpuPYfS9y7FN0dz9jZpjxbfs6i4Tmh4CjjtBgpZQfSacRxq +w9e1NMyaaArELnaav7EvNDenOIfq44tWXabVmrs045Xa7iXanmeVGVj8Z/Fh7+jf +54GXUCfmVS0dP4i3XRXb105VSXm49hMMaBChFr6geg6jhHLXeKY2Hl6sHP+nsaLE +fe1sD/8D0pfL5MNfj/nzlA9XFhOVti2DL2o6NRcqRdCXQoZe7Xu/Q3yldFqrTGWD +w77k1tJeD4lAcZSanFoaB1cnZXtlTomWlff8TZfMAfar/Omn9ov3RnNnhcr9xTf/ +h4rLFy3vIj999Nxl/rfSEOXr4VnRChkK9WsBbU8zPmwqqLy3FqTypo/SXmjGp7KL +2xloSfpley/WcKr31DJd6nGtLKrX/AbxMK/9eistLHib+vt+YinZ9dmAc+8WWKfN +0B7isnFr0Jro30k8m3uXD0zuFsyfdtd3n5pqmvxevybk2LTgY3jab394P58C96u9 +sIa37CCbfc55HgbScQN/nH5DxWm/MNjbtov/+U4J/b9l69Jk/LCLdW9Lpa3501qd +9+nG3RvRev7od0WNTuKNIn6w9K2oWlS0Ylj0nHhvFww927d/V6r86YenGgO/kKhF +xd0kPoJ7ffFpUElBrACNEKKI6hKomNVYjEqKOSQmxpmxsWzoKOAxM8Hhtz0IfrJA +GT4Sqh6RyYp4mgufi5jj4aKyyjQVXtDrAk08r97e1kgLglXB4VV1K69gDu7JgSSg +HY1USOgYKTE8UroGJ7MsyJBgM3cPwZKiFPMW5ZC+wM+1vqZpkkdkI1HFzWVqTY18 +awJkgSZXUgmKkgu8tW38rAYup61TBB8yYq0xoMkcil0SIDXCDgUoMAQ7AyuUMpNG +vDoCUqXx2mLXAr+iR1X1/hC9SJWxjotNgTTRy3GJAiwJ+lxadcccCqJlZQXqYurz +fKVj28tWpwz7qRfOIVTTSGGWRrDNwgsCIaFTp8rBlafTTlDCX22HolSjgp/NzUZU +HKWcyplkVCA98hMF0EAoO7meoB0o+PIzS2WDfjHOK0ZzERGPrKpqmlGdal30RNyg +jWmGcvyPG81w0/4WhJli0lBow0CCSZEERgUBDypRikFx+RoUGH+8yc/O95Bi/auv +SVG+YCUPgmKkBzGUK4+F1AVJQs8BpPZS1/jKN9579uYVM0BFny09H6BjRt1rKjA7 +IqKkdB5gDATgKIbCrV9dTGZNHDEWg1mOAgTNFFBRlQjUE3gEhqjJxd/ZYqfF32kE +XvK1nk0/CdV2oeYixSzdpZGAprSAOCIOMC3BJ0jt/J0UdN8tHMLvqVGz5gKJpqLm +HKNcDCYDKsiEuhP5LI3/nc1sdLDlM0i/6qkINgDWjsYJmqQqKgEeKYyxTFoImNKp +8Mr7LWEO5LLIuIAXmGUFioSNoBMPakSubL5htV/FwhX8lmLCD4n8QNTXXOxCmGCI +QmOiabSEACdhIjND8FfCzc1TU0WpEAjO5C2p05HSUszcggZEdoXGMlYIaZD+6xOY +cALIOhVwSDsYyFOpZKUJks2ERGouURyDcMKLoIUioZCKnQf7Jg5JyjTYoAThfBQY +k/JEAE8IhWMHJ3gODIWnUVbw8mKpAVnCROE+xjqZcaImhiYGlwx+nsRkRo5VUR5X +FaV4aLeyjEqIaqCiEdRSK14UJGoU9gVdhF4kJtu6Pu1wEn9eYk2pqcUkRujwUgks +66IIMN4xEwuA9EV58O+LWZV6RU8VdZoKtQYaFxwJchSmqPGq4wRF1vkOth8tDSN7 +QyH4VkQWhAkzG1KhE2lAeFNgZC5MLtrnRfHmvyzx4RLYsHpLiOA6HQazwz4FRgTF +swDgoOUYSxmXT5yh+Zyt2ilh6FAxqgsW/qkiAHO7QffvCg+aEcO4hLukhCvmnEEp +gvBU5ceFtdJVhi48D171TD2S8cjGDGFohrSkXikVCTLQGJmc41Tu+JKGnpgEZYQg +mnZYSpHwMccU8nB0Zg3RK0KMoiBolaNDcqbLtDJvs90yLbmF/3GYnEoMI6SVpAmh +ZxOYPjgqqdK7KhC2BKn+UDRL1aITUkZFjwtQYxQyErtUXTOalksWMuAZovNhODNd +hSHZvkAHzvT4Xwnni+XTj0yPG2qhoBgTiM0skpMYobJIEkclQqbbh5rg+coMzGm8 +4JdaXAObmnrAjAQNaGIRO0BjRIxv5TsxR2Sk1+JYPbSVv2ygBUI1itEYEzKJfPI4 +WHLhw4Vh4jgX/PwVGii3r1tsVZva3l8VGOR5T0oUXZoj4cDodMz+O3699WV7fXsP +Wb+T968Wz7FfS4L6TLMVRgNPilQBgpP0cSMQWFu2ocu9zqUAHlBybNrBWiI+Uzcy +TCZwYbJ0k+czhqeSwGGTJz2I7Ko0qnzqm8FiJkPFwaF9NddMk7P645uVE/SIrvW0 +MxiD0jAZP+ZcLckY7vqux9RPqrT+cf3yCwW2iMeOh5Z7jtZc+29Ko3+477cVJ/zZ +T8PhZSO5dpbWWUkFAp3hmacuU8YjBApx8XuTeUimGSuloFwNnCYqksoyTeIoSuFh +Dzw90B6cx2YdjesvyPsr1Ir8qQZzLaefNnzXH0VUbP4oS86x5Iqh62bSZV6KKqH1 +b0uHW/ZftegKa/PLMepjoWBXHDmw2PcqiUe1JeF8jwNm0c+1ZYmYnEpJWGfqO1zA +pw7EaN8Fx/o/XM3kwIy/rwh7vqTdifQvexXgfJYxddXaUYnrCFqQqECdmQvRINgZ +GlkFlrWGhXarTq7FobcVIiNdgEqiQE54PoggOgAzHC0FqlZ3EWSRgXGetlOrWQF4 +zcbF8PEtoo/8UFzpa8+ilLEPqFWi245GMrdccdanNIz+0c4tjx0+Mp+k9FvUbIAv +WemD9IAa6cpkRYQSZsMrvfEMo1S1zrHxIxvVG4y9Oyl6ouywV9kp3iHD+llNvlFy +4kTHOV2rLLGoCEQI0xjmsEJnYP4F5qfjdWVzdlJRtHODELmwmBWYxLATuw0vAiSw +wnWheZhRm+zr8XfDrNRfP9pdGpDbtVVlNNEaYSUryuBpjUZn01g9CoMlalW8BMMY +L7iKP10cav19nWqG3zXfL3pe9g3sDZlwlg9sH0JK1CSviXxABpkUbCHz+gcy2pe3 +evxvZe/XRxWHkXk/sOHUhaO0Ypa5JtVAYKUMpzONclTSy8dHWh56FZvf9abUe0hO +Cjxsn0eWnytO2HUFsG0lXETpRCpg9qW7KTOfA2XrK16QK1Mr9ZghPkQKnsbZIwyX +IYxYicoC/uDMijKuZev1Wy/gDuMM6fs07wnYXZPO0dFrFqQIYUBpdmaoUCuSx+KX +sdeQ/EjTYpqhZPtU10lFXAwhHgZh5XbTRw5nYIh1Yz2TsJOFUUAyEyD0kNGdEJr+ +LYlrS1iwL+xllBEVzqw9/AohuB+rIP9fYFtHlvAp4MM/Xbnbphl7THIe0cs2md/1 +iA2HTpEzzAqdh+grljHEws0jojHY49iUMm0FqR4oTSXzWBCp80TQ1xpzGCB/hIix +jz0AcUminPSemvyWYlPm4cSTUQWUmJ1l8H185o8yIcI/JSYNJoAoPSgzKamWqFhL +gZhVKVN2oMF5DMlo0rPwTcPSvFwYmDttMco+UO1UnxpPsJxuUchj9vQbxrMYWuFK +caM5PNhPynWfXYS2sxQcG1SPVRp2HmsC+2XB+eaP9I3H+lH/nrb/eBr56un4j5pG +I3kR/qqeMTqizxKOTSKHZMtcW1kO1qWI14bMjFDJ+3GUkdynEKO3/NCAScAQDUgN +XITJGkn6VVGcYNdZYlYqBE4i78SOsomxXSVNTvoBwFUofMfH5mizgKy2DsRFQdbY +NCekdBbK1zYbXwcK2GZ6pElOswis9gro/0cWGsUpZELOP/IfGgg0uU0Q5UxsvtMr +KN7lDIhij6h3iXZKFvAAasKUIbZoGkwkcSEcgfQgeg7mVRWvjlI90pDI36vFtrXQ +yPwUCSUPsWaVmiPoHpMil4/dyku5hWDOaVt8lqJCWa1MxnzgZ+O603B1QG2AQlky +OT+EBeXgGSwqHazqbVDWW6stQGqruDLaSTlXQq/wHyN4kTUpgvZb9F2Xe2u2oqMn +Ni+/1SWsgL50780LRHCbf6xSsdcjhAc5UTdu3jtfwASSGg3FXM22Tw1xzaAx+AoO +vKS+0ETF8VkAdNygbYbCP9IY8ijIkErZzAwoAnCmmQLgnYfrKzWSOQES36O6wCbS +9xgVRl3kCzLr8NVB3YAwERBKusavRrMJKnYiqxDt8p45cee58w4q9uRHL+KRIv9b +++VQzdMX2jlOJAOkxuipuQsABB480tJ5LZ8AvPwVEFC8oMDxGjqdmA0p2Pel1JIJ +QZA7ohQG/Ah1P3deJgfIieieaokzLsrMeqATS4/zFFEKDfdGqqBdkZkhWG8SjTMW +7REaDj7meBSeK+NHoke8uUh3rvgad3TnzpU2TcEPTCYM/ITC46ABqb0g2hgoPJTG +z9j3WN+T6g5Y8IWepBECkuKAyohrAE+eZ5Uji62m+cnL0N8zWbCf5Ma8ogngAFNs +w1ALUpSzNV1E0SVo0EsBTleVg4jv4x58inDDzZ2Dou8zLEVWwVVL5sLOzVkQNKJ1 +IYIsTz8ARg8VhsIalUGZG4l62JIZjTAdBfCTcLy1cRah8F0VBWV51cr2CBp1D9dc +RTkF6XHfQFee4Yt6JQVWFPIf+ERD/oaEnisjjpx+Ri1kFal6gZylivH3m40D/xWh +vgBfuB64UAUSu720slyDdoLcUXAYUGhy8UGCICLqTejiyGp2DsVuw+7MCYiF6emO +/RUHxVby9irLkUDNUIlcFlxfjESaSIqqSANZ80aCRYlS6eFVygMH4dNVijqDWX1U +YsqKCY4kYhKAYWI8DRyNiEEBkqd7R/dqVKsBTD4yxmg5uZECtRf3AQ/EzO8mmgZV +BGY4F7zp5dv18pjs1PokfJt6Fjs10G4dj2DJI8Bhx/wYh/+K7TWnmbT16eTjCmAn +aoLk/WJnqpP4MyqmvoHwUGrDmB+qirAuLiKc6ZZnL/R6DO0y5GYxWV/c3BL7tsiL +llrx38t41TI01t1/dUVMVKZox2kOwGMBA4MQTaQRMFBhUEKl8PsKd1KAzcOBypzt +j0W0eYjtLmrViCVJK51DgZJEbh4qOpOwsli/72rlYFdny7gIwmCy3HArVVHE0s1Q ++csgYgVgCRQ0NxTkA0AmChg7CWq6lMQaEB3ah8oZEwu1os58qSZrZ1UZsbBXHbLh +R9XQ73U4eoP0xDPWa+2vnsWOYm9XF60LytdICz62vzfI3XPgz1TGEYQeHgqqhhgA +zGghOTMBZHNnXBiUxX+iV19ANcMBwGnIBW7ob9/4PsSpaQeYUmM6CxkRgLmqruWk +WJ8ykf2PiD8ZFIIiJAGQy7oAGGH49HgsUpW6DX6Tt5gS2Fx+B0lTD3/HBE1AJxqz +VGpvHK2UBHyTBFwOuaH+r2SaIMlYqxsBxaiuCgQSxUdA0M/1mssfRygJinqpGgnL +wiMQqmNb7Sg9rOSjw+eHfQGNFus2rtQ5Vw+Su1F4OiTdSFgO3avkROFvHn08Oits +8eQiUpekuqyfCRqkYHcAGw2Wyjb5hH9Rk/3jnNA7OUVnKMh3sLAfC9g2vFV4aehB +jZ0Gak7rNcieb/OjU+aL9cELjuzPw6aWTrSm9y/RekX8xt99jq2eX281ZDwCWFUd +R8cu8j0MIy0hkA4DWiIiYS7LBEujYjJHi5HK2/TYFNBvtYiRhTRzq+H4EIFyAEyi +ONgok6DmB0uKAcyY1SVAHHdZSuAyxQkxrSQhXSPxXZVKJMmwMZqx0GueJrZEgkPx +AX/OMWl20fW95r8P9+WstYIkqMkCYnkqDh6ZSTXWeomqRzSKlKqmIFuTjcoTXoja +CR4OtcCXJR2cr3Kf0rRWda0Xv7md3mRBAo1GXgZTFzN90AtSNInMwBzp+yI2NFIi +/UdPuOf86Iy7f/2NGbuEOruF4SRqgDOBWRZpE54ATjMtiAqAUDq7deKZsSTY1aeN +zwvgwJSIpKeunG3OQXPBVE8K3dFpc1d4uCijlseqBCwzdvy505JeVZQABZUemsE1 +wUwuO0hyNKSyxqZJcFTeaoxdudNK8p6mc6yotPaqTvZ8tZzfSSUkjVHUeyOO+NZc +RUtbK90zUYT7aTa58Ym3aaxU24X9hGFNBB4whIIe1Et2ZjFdIIlrhCw+KRzigPuj +xGa7NTr8AsORKS/YUriRDo8x0KhNiOU8HvyDuTgqzlBnTvPzdvsOBAf6/gjzxjvV +4AT4M4jJtxkgyN2Qr4IU10TzKm2zCwgelI2Jav3rK4tW4p4QVJo6cIF8JIcBTbxL +8IHIC4WcJVrki8G0aW/T/z6uqcGDGVggoNUZQwe4ZQ0lDl1BDUOBAlERZc4Urplz +LPNwDvCTE/nVFB8E6iC+NE0U58gK3Qm7SVh//rHi5xj2+sc+fz78zY889mIPRgE+ +JE0+jgSQTkXolcpiYR4+iqu/KUZagH4POXDapIiavraik3+YJtwfFemawkbGJqqC +OcFDARQpo6A8U6pIc1H+Ear71dy+XXRZOLnRAYSJeEQR16XBnUmmR5ZID6BlOM+d +EP+vc3ReLpUm0iTHUbgHUUQg1otjSRYNb5i5yCfSd5YscskbzvxyUowgKEZZZkqQ +JpoKGJ1MPIXm6jgklWi+P/tQmjQUE+w2+boJCKghwjQ/adFQZcQJ0BLDXAJ88i2E +neQclCL/0UNHchPrlEZnUJgezYCop6rAIDAsS3gxJxqJOgpgfoVscjqkuaawNZN9 +iaR7XfRbW6xBJ+gpZ+xYmem/M6oTMTknrwhD91/KcqtJ+6kEFv2SQifKNCufnLT0 +ogaD36d9osKaRDkq+BpoVGGidbCUiecbrRLyDCjY7AEbBpvAm+XDUDVvGo3yVavJ +NwgRRkj+kvSYtPAMgmkVQhcSlGVpOzdA/0jttTIypLdUbGESOCYqi2M2JqoRJWc7 +IjXQsE58KDDPauLz+39Z9l87P+CV3sqT42zZ/ZcSzAoCoNqShSyUJUlOPub7qUXX +dCZKWWhLFLJRlixew3xkojKLVUEso+CHV0pjz10QFgQ8ZeeMueNn3OwrOfFSN6ph +dHm2pC2LKBEUslGWk15AzmsZJmdIBZ4qKWWiLUTLLEolhU6U6Vie1jrFv8JSZihO +CnGkWq7wUhIm2eHqb2UwmRqu/1KlJcrD5FpxlZYSEus2aZpDfxsUK8HXeW4DfTaJ +KKWWiRHQgByVw15zE8XUBrFjwjCPFeSDqtDE+zApedXGJ9efDY7AJYonUedz+eNx +JIScEc5pDogC9Qrsx38uA0iKMYFgZwmsA3NYlsh5Z0iSbsA0Ja87LsChWM+NwZYS +FsvgbtVSw2Mid8uWqxspdrF53ipbClqkCSKASwpBgOU7ALpMKUU85FbzOnw0e8ME +sdQKSmBMgIex350/aZIfo2ZXJcOThEFkqUpxP4pP9vd8L/sJMRt1jzLZvP/jsYxy +R488kxl4ig6v4Bh75rKN/cYYH/QY4XI5aSCblIDbuxXapKg+xqVMQymHj2tdwy1l +3ZHSrliX6felSDv2xJHpUuQelBXHuTv6fI//WElFfClCfOyhM9VIUdb0+DygJdiJ +QY5+fOhiHpQJYBLMZh2ZB5jwUjKmAFdw8DkpvAyZIbgrGwYJWXFjR8Fp21YFkOE6 +uCRiBkCB0vSbBiSyBo2SWphHgq4LKBcU/X/KSG28wMGyxQTRPsngiGMuc+zYyWTX +IqgotKDwA7+Em37+G7ac0bNjMD628vEblaRTjy6xpEiBNwcZNuMZHxnRv25v/qtx +pLZrLDBQKhBnf0GvouxS6GV0Sk/AApfFRnQzShjkEnONw6NFAb/XbfNETFKBSkck +p0YLtPZomWwV4vmy4B8DxYUpGFErGFmC0AaJcQEBNyZL2/6zLJOe7c/hfuToQL6S +RovsIDMvWKGc4VYE4QsKpMkM8n+9q2YL661zNNPsqPCsgDpY+Tj0dHew5h6Vn2Pv +qLnYL4/OmRkK/11IAE8QEAAAAAADAAATAAAuALNtm2wNDWaDqqq2oVDDqtqqqo2q +U5tVDbUNVVVVQ6oGqqqgqsyYEc0AGAAAAxSHLcbF9QGArZFNY4CY8Cb8AtakNbgB +D9BsbMgNNiDSuJJ7TjS0se0frlGN7f8FTFzsnwNiaKtjw04HHrBkHZ1qWpmyw7A2 +g+x2eN1IyDoypSg2vCZeAowR4wUACAAAjBTAkdgBqzvNsypG97vsdK+5PHgACkiq +kIlpW2orL23LvNqz7TJKnKKgxD/f954fOD/16cTMSouOx4Z6HYbCUzfenj96Vv5t ++oOxucSf1f/1XBXG0oQlwdbEwQW15X0fSVX9WFh3WklVSavnl31T63RllbQuQfd6 +rtmh/Zb++FsvxbXjxHT1dWQVlHSEdRF1BdVVxYpOSkpCaSpZOnERYTEBYSohOdlH +FBDJe4Sk5INfCScI/kq3jj8O/1R/Z0rS6kpask2HYGGH7WX1daV1Zb/VGNpaPiJ6 +TibdKIz8iYgoMTSJi4S45t+T0snIx7xSkMakkfmQ0U1q2orh0rqaqe5eO4YqvKiY +Jqpz+Uly+rpxSu0eQ0RJ6TvJ770fgCQl3SWgxJCAgIzfl7xIyqFqgqGiAoNaauju +O+erqnR5mHRMQJxE9pkkCSQJu9unEIZ5J92yewph+G5yorVfr3x3dMq7umHvTsl/ +8LG3X/vTgFLvjyQoKPnxqfdf8kqPmqPXkv+ofnM09S/300UzR/n7N7f776tJUrLe +lj5IlvBBfh4CEgQSEuJiYn2P9yNS8toPHTHVZKrOsrrS4qe6xt3lOenXMDUsleaj +d6/ktN3tzH4kjZmcJyWp4YQpYt7+vFReX3Q+9rNx1LTFtTAftZ8C5hdhB6LwvYyI +d5cSslESrf9F5ispAnWCb05NJCf9IQCkrmK6r9dq/OlvJd15e+P/KDCiRkq7R6Cn +QdJJ9kTEhAkKHyZK/UoApJtkC7z+9G139ErJb8R+35v+UnvL7qbfxN8OnBq+mXsD +GeHtPwMg83K9P1LiSVRXYVxd3/uJsvO3748oZ05/+U/3JZGhfCZBbgT2RCk+CZqN +QVn1DqREgeIC8oRiz6Q76653wKKpmtL7z3MWIX8/fyeK9icB96FJ9ZKSkZABfHIy +/0jKwsM8/m4+RFE+tef9JgCkl3aF6CWqaXw1vnEx9kMBq3s7UhJmaoPtqP++P5wI +d5NvciiDSiX2848S/JL2UweQevW9//r7/uFe9vKXRkhIQExQ6JOUKRMn3e5p+8MJ +CeSlpGEeyEn/vZflQuHUyQnyq08BvmtdX8spZH/EFEaipO2NxCTEaYg+WkIyUdZf +IijzJEIc+JWuQK/+um7Xanr1fqBknb1bEBOTkXlv5N0nlQvVECaTj3XvTCElIkkn +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 +kMFlMGvryOz18/SLg1m5xzGLezh6iZr5r6yyWv34bYxk7OpZvgHOAlHxjQuHKjy/ +aJTNb/dUh1aEW5mqKpXgNUaoSnOZ9eX2xY9reGZQO6XxlwnCe74gkUbgOo05gjZE +PLFspq5jOk2EMnDQ5/iQ17hrEMK7NdYZDiq+Ab+pXyboY4pt9k5krdMuo5bvBmID +jViO587XIgkFNFuK4RE18KUZH5WBhKmfrdblRWrLer1l5Yb8qH7WOTufCquBOGGz +olkupNc5qyiaId4AlI0oyh7KpvKnDEulw5+bGs1ncys7DFLkjigtqyM431rdh5bj +IlgjF2o0dsTKvfor1zSUz1mlYbFbud+lYGh0+MfkIJkcU/cxwZR4QnKtvhmeBZRV +7wWNYChuAEcT0mUccKmOjQl2orFNp55cXv7C7xkL5gA9st2u1aGfK5xMGb4JsrPo +qEQ9CFwYq7fbVl12Rbv4aBXNGHPL0CqrBJmr1bYSfqj2WSs/u/eYL1sOaBTF+5k8 +GvZb0pyZO2mC/V2NfVbdFD721q2nZvz1koZuIZZxNBMg+rf9oBjLCGwW1Oc2BwJm +mzajiIO2tiM+JnAOxFXhI1WOaStw/mes5KzeepP+tref8NRvNSyKmp4UnDBryDuj +EQhApy3dwgIM5OQzrjVR2sTWy6YLMYKqzMnkrOioMczJ6mLqBYk6VuR+YK7c5zDL +/OaRC+YL5PTjVP4QZFVAvNMRP16DKsHB0qBDu1HK6iNweHTM62Hr56Y2ZnHiiENc +wqpSHrbNcNo4Wu7q0uoQWXwmCWQ6dtwMUT2k/tJobDEepTGSLldfymXWD0++OoiK +5jRbNI18wv1EMl3FammhXRE7+Cg8NmHs0MnXup5alu93Qch5uTQq57z7ecj02ZxX +xGoQxZV7HGrO/uKDyJ1ir5ZBRI1xOh5L4i/9MuTEe+Jb3UHzfPJYW9mxpsYV6EMv +U6Z9ih5dUNO/FZZbbyiKK29TtgjuL5z3TnLpBxnLR67vJgjE+/b1EViMg7L+aqzl +T1e/weUHMby0R+deq3dMOZ4Rxl5I8Ll3PIkQJIXGCrY//5ZRcV+Ed1p8xVTmNF+5 +az3MoXepK33F7c6kizSLOsgD6U5R0Lr7B14ZeWneGXxn+KCMvKuLkqriw+mbzutO +R3i6z41wVhl9vcNb7NyAMo+7MsepUyw0+AL628yUEB1owxk8EHeuuz4XExTspdsk +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 +0GzVM9lIH8DRhcGzs0Bbm60uJa1DgZJHjutj5eg8RSmyR0YlGywoBn9bakq2Uz/2 +5x3Yo/VOGorVuO7OTQugpfSg+lzhjJroUVzyqcgkhaoju3N+gQM5I1H0oQsvA1Tl +5azOYWEvi5yMHVsg7++uhHn2CConPRHiRA4CZtcdG/yYvoB4eNxkjk4sVkKw/Z9k +7K5qgO30ksb2wMxtUd9dceLNhsbeETbY9tGpb8ASNzvpegkS8Fqz0m1czQeeN6jb +Baur9UatuhzKWThwN5z5bZD5GnJ+Krs3vISGAiNj3Z+U7r5OZA390NgklmsVZlJd +wxZqDaIFADKFNrsu012vPNW0s0hpiYu7rI7PV3O1sJcfu9TCpKUxujWp6erK6TYz +mo0ove32vSQZZBQlODgt8jgo20F9+LuMHdYzFPtpVk8jA0cMOdFfKXlMZ+UXsnKG +JygNuhG65nlgsRQhVw3OvGg8NB7Yk0/k9Pc8zj3CWkmiau7X48li0U3NQGtt7s5b +Vy26Ok3Mk69VE5vbdpTGFjU9DdysFhwf9Wa4C825GC4HiJt/7hQ5VVUKt1UHn7Yd +/gZm2qJ9OTqjOO81dlq5dVd1euMOlBPNvNHOBqpUWsxXm61tscsR2GZtmRdcEPRE +CrYY8i+W6tZ85Z3+3KYm3uZwxJKqNazmDhwJlerKAGwsavC1hU3ZlHzYJwwIvAco +TXeVa7yrHBdmvrzjjnhMrMymIhxp+KzNY1znBsrJ5W14fo+iCy93Q7KnUvJiAy9O +sVqa/qurJh7SdE7V7R1SeQPSA6kB6VCeaSvGRzM3c3t25jVELs6D+hoXLYGwKR32 +BgcGfisDG0HnPMt10Sm+Hhy25cgltZaUwy+11scRP6J+KqOsnFjguW5OeZdusiKJ +htwF+dIsh4ZjKzeCc3nyWGvVGleAUYbrBqWED6UAgj6i0Iz4/nJS5QQD+/JQC0uw +zRX3piPGq2jB4uAyy1+x5JQr0Q7g323cOesmhqw4T+uauFDYSDTUkkNNZsJIyvEm +OtkeRePE46jtY0f3mqFILarOthPCLCOt5gxBcfEgddT69BbSUYTqoKomMurlwq9l +4IEa5cewBIgJdrIOJ5jxm4Z/v0EsCXBHOsruMC3/r0XnPQyZoGZIFom4iRLEMqFt +bl5fuaTI1HC+U+CLnjFqnSOo7sZfczuvTE9zW4OwZOGbtTHLymyhwE1uJ2K71aal +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 +hQvhwrhwLlwLF8+FIMw= + + + + DaoHandler + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIkRhb0hhbmRsZXIiDQpBdHRyaWJ1 +dGUgVkJfR2xvYmFsTmFtZVNwYWNlID0gRmFsc2UNCkF0dHJpYnV0ZSBWQl9DcmVh +dGFibGUgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX1ByZWRlY2xhcmVkSWQgPSBUcnVl +DQpBdHRyaWJ1dGUgVkJfRXhwb3NlZCA9IEZhbHNlDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIENsYXNzOiBkYXRhLmRhby5EYW9I +YW5kbGVyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQonDQonIERBTyBkYXRhIGNvbm5lY3Rpb24gbWV0aG9kcw0KJw0KJyBBdXRob3I6 +DQonICAgICBKb3NlZiBQb2V0emwNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJzxjb2RlbGliPg0KJyAgPGZpbGU+ZGF0YS9kYW8vRGFv +SGFuZGxlci5jbHM8L2ZpbGU+DQonICA8bGljZW5zZT5fY29kZWxpYi9saWNlbnNl +LmJhczwvbGljZW5zZT4NCicgIDxyZWY+PG5hbWU+REFPPC9uYW1lPjxtYWpvcj41 +PC9tYWpvcj48bWlub3I+MDwvbWlub3I+PGd1aWQ+ezAwMDI1RTAxLTAwMDAtMDAw +MC1DMDAwLTAwMDAwMDAwMDA0Nn08L2d1aWQ+PC9yZWY+DQonICA8dGVzdD5fdGVz +dC9kYXRhL2Rhby9EYW9IYW5kbGVyVGVzdHMuY2xzPC90ZXN0Pg0KJzwvY29kZWxp +Yj4NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicN +Ck9wdGlvbiBDb21wYXJlIFRleHQNCk9wdGlvbiBFeHBsaWNpdA0KDQojSWYgVkJB +NyBUaGVuDQogICBQcml2YXRlIERlY2xhcmUgUHRyU2FmZSBTdWIgQ29weU1lbW9y +eSBMaWIgImtlcm5lbDMyIiBBbGlhcyAiUnRsTW92ZU1lbW9yeSIgKEJ5UmVmIERl +c3QgQXMgQW55LCBCeVJlZiBTb3VyY2UgQXMgQW55LCBCeVZhbCBCeXRlcyBBcyBM +b25nKQ0KI0Vsc2UNCiAgIFByaXZhdGUgRGVjbGFyZSBTdWIgQ29weU1lbW9yeSBM +aWIgImtlcm5lbDMyIiBBbGlhcyAiUnRsTW92ZU1lbW9yeSIgKEJ5UmVmIERlc3Qg +QXMgQW55LCBCeVJlZiBTb3VyY2UgQXMgQW55LCBCeVZhbCBCeXRlcyBBcyBMb25n +KQ0KI0VuZCBJZg0KDQonREFPIERhdGFiYXNlDQpQcml2YXRlIG1fRGFvRGIgQXMg +REFPLkRhdGFiYXNlDQoNCidEZWZhdWx0IHZhbHVlcyBmb3Igb3B0aW9uYWwgREFP +IGVudW0gcGFyYW1ldGVycywgZS5nLiBpbiBPcGVuUmVjb3Jkc2V0Lg0KJyAoaWYg +dGhlc2UgYXJlIG5vdCBzZXQsIERBTyBzdGFuZGFyZCBhcHBsaWVzKQ0KUHJpdmF0 +ZSBtX1JlY29yZHNldFR5cGVFbnVtRGVmYXVsdCBBcyBEQU8uUmVjb3Jkc2V0VHlw +ZUVudW0NClByaXZhdGUgbV9SZWNvcmRzZXRPcHRpb25FbnVtRGVmYXVsdCBBcyBE +QU8uUmVjb3Jkc2V0T3B0aW9uRW51bQ0KUHJpdmF0ZSBtX0xvY2tUeXBlRW51bURl +ZmF1bHQgQXMgREFPLkxvY2tUeXBlRW51bQ0KDQonIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KJyBH +cm91cDogRXZlbnRzDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicgRXZlbnQ6IEVycm9yTWlzc2luZ0N1cnJlbnREYg0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBFdmVudCBmb3Ig +bWlzc2luZyBDdXJyZW50RGIgcmVmZXJlbmNlDQonDQonIFBhcmFtZXRlcnM6DQon +ICAgICBNc2cgICAgICAgICAgICAgLSBNZXNzYWdlIGFib3V0IHRoZSBjYXVzZSBv +ZiB0aGUgZXZlbnQgdHJpZ2dlcmluZy4gKE5vdCB5ZXQgdXNlZCkNCicgICAgIE5l +d0N1cnJlbnREYlJlZiAtIERBTy5EYXRhYmFzZSByZWZlcmVuY2UgdG8gYmUgdXNl +ZCBmb3IgQ3VycmVudERiDQonDQonIFJlbWFya3M6DQonICAgICBUaGUgcmVxdWly +ZWQgREFPLkRhdGFiYXNlIHJlZmVyZW5jZSBjYW4gYmUgcGFzc2VkIG9uIHZpYSB0 +aGUgQnlSZWYgcGFyYW1ldGVyIE5ld0N1cnJlbnREYlJlZi4NCicNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBFdmVudCBF +cnJvck1pc3NpbmdDdXJyZW50RGIoQnlWYWwgTXNnIEFzIFN0cmluZywgQnlSZWYg +TmV3Q3VycmVudERiUmVmIEFzIERBTy5EYXRhYmFzZSkNCg0KDQonIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIw0KJyBHcm91cDogQ2xhc3MgY29udHJvbA0KDQonDQonIEluaXQgLyBUZXJt +aW5hdGUNCicgLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJ1ByaXZhdGUgU3ViIENsYXNz +X0luaXRpYWxpemUoKQ0KJycNCidFbmQgU3ViDQoNClByaXZhdGUgU3ViIENsYXNz +X1Rlcm1pbmF0ZSgpDQogICBEaXNwb3NlDQpFbmQgU3ViDQoNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgU3ViOiBEaXNwb3NlDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIFJl +bW92ZSBvYmplY3QgcmVmZXJlbmNlcw0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFN1YiBEaXNwb3NlKCkNCiAgIFNl +dCBtX0Rhb0RiID0gTm90aGluZw0KICAgbV9SZWNvcmRzZXRUeXBlRW51bURlZmF1 +bHQgPSAwDQogICBtX1JlY29yZHNldE9wdGlvbkVudW1EZWZhdWx0ID0gMA0KICAg +bV9Mb2NrVHlwZUVudW1EZWZhdWx0ID0gMA0KRW5kIFN1Yg0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFN1YjogSW5pdFJlY29y +ZHNldEVudW1EZWZhdWx0VmFsdWVzDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonDQonIFNldCBkZWZhdWx0IHZhbHVlcyBmb3IgcmVj +b3Jkc2V0IGVudW1zLCB3aGljaCBhcmUgdXNlZCB3aGVuIHBhcmFtZXRlcnMgY2Fu +bm90IGJlIHNldC4NCicNCicgUGFyYW1ldGVyczoNCicgICAgIFJlY29yZHNldFR5 +cGUgIC0gIERBTy5SZWNvcmRzZXRUeXBlRW51bQ0KJyAgICAgT3B0aW9ucyAgICAg +ICAgLSAgREFPLlJlY29yZHNldE9wdGlvbkVudW0NCicgICAgIExvY2tFZGl0ICAg +ICAgIC0gIERBTy5Mb2NrVHlwZUVudW0NCicNCicgUmVtYXJrczoNCicgICAgIElm +IDAgaXMgc2V0LCBzdGFuZGFyZCBvZiBEQU8gaXMgdXNlZCAoMCBwYXJhbWV0ZXJz +IGFyZSBwYXNzZWQgb24gdG8gREFPIGFzICJJc01pc3NpbmciIHZhcmlhbnQgdmFs +dWUpLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KUHVibGljIFN1YiBJbml0UmVjb3Jkc2V0RW51bURlZmF1bHRWYWx1ZXMoIF8N +CiAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5UmVmIFJlY29yZHNl +dFR5cGUgQXMgREFPLlJlY29yZHNldFR5cGVFbnVtLCBfDQogICAgICAgICAgICAg +ICAgICAgICAgICBPcHRpb25hbCBCeVJlZiBPcHRpb25zIEFzIERBTy5SZWNvcmRz +ZXRPcHRpb25FbnVtLCBfDQogICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25h +bCBCeVJlZiBMb2NrRWRpdCBBcyBEQU8uTG9ja1R5cGVFbnVtKQ0KDQogICBtX1Jl +Y29yZHNldFR5cGVFbnVtRGVmYXVsdCA9IFJlY29yZHNldFR5cGUNCiAgIG1fUmVj +b3Jkc2V0T3B0aW9uRW51bURlZmF1bHQgPSBPcHRpb25zDQogICBtX0xvY2tUeXBl +RW51bURlZmF1bHQgPSBMb2NrRWRpdA0KDQpFbmQgU3ViDQoNCicjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjDQonIEdyb3VwOiBEYXRhIENvbm5lY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogQ3VycmVudERi +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQon +IEN1cnJlbnREYkMgdmFyaWFudA0KJw0KJyBSZXR1cm5zOg0KJyAgICAgREFPLkRh +dGFiYXNlDQonDQonIFJlbWFya3M6DQonICAgICBDdXJyZW50RGJDIHZhcmlhbnQg +d2hpY2gsIHVubGlrZSB0aGUgb3JpZ2luYWwgdmVyc2lvbiBieSBNaWNoYWVsIEth +cGxhbiwNCicgICAgIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgc2V0IHRoZSBEQU8g +ZGF0YWJhc2UgcmVmZXJlbmNlIHRvIEFjY2Vzcy5BcHBsaWNhdGlvbi5DdXJyZW50 +RGIsDQonICAgICBidXQgcmVxdWVzdHMgaXQgdmlhIGFuIGV2ZW50IGlmIG5vIHJl +ZmVyZW5jZSBleGlzdHMgeWV0Lg0KJyAgICAgVGhpcyBhbGxvd3MgYW55IGRhdGFi +YXNlIHJlZmVyZW5jZSB0byBiZSBwYXNzZWQgdmlhIHRoZSBtYWluIGFwcGxpY2F0 +aW9uLg0KJyAgICAgKGUuZy4gaWYgYSB0ZW1wIGRhdGFiYXNlIGlzIHRvIHNlcnZl +IGFzIEN1cnJlbnREYikuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJvcGVydHkgR2V0IEN1cnJlbnREYigpIEFz +IERBTy5EYXRhYmFzZQ0KICAgIElmIChtX0Rhb0RiIElzIE5vdGhpbmcpIFRoZW4N +CiAgICAgICAgJ0Vycm9yLUV2ZW50IGF1c2z2c2VuIHVuZCBob2ZmZW4sIGRhc3Mg +bmV1ZSBSZWZlcmVueiBnZWxpZWZlcnQgd2lyZA0KICAgICAgICBSYWlzZUV2ZW50 +IEVycm9yTWlzc2luZ0N1cnJlbnREYigiRGFvSGFuZGxlci5DdXJyZW50RGI6IHVu +YXZhaWxhYmxlIEN1cnJlbnREYi1EYXRhYmFzZSIsIG1fRGFvRGIpDQogICAgICAg +IElmIChtX0Rhb0RiIElzIE5vdGhpbmcpIFRoZW4NCiAgICAgICAgJ1VzZSBDdXJy +ZW50RGIgb2YgdGhlIGFwcGxpY2F0aW9uIGlmIERhb0hhbmRsZXIgInNlbGYtaW5z +dGFudGlhdGluZyIgKFZCX1ByZWRlY2xhcmVkSWQgPSBUcnVlKSBpcyB1c2VkLg0K +ICAgICAgICAnQXR0ZW50aW9uISAuLi4gdGhpcyBjaGVjayBtYXkgaGF2ZSB0aGUg +ZGlzYWR2YW50YWdlIHRoYXQgZnJvbSBoZXJlIG9uIFZCX1ByZWRlY2xhcmVkSWQg +dGFrZXMgZWZmZWN0LA0KICAgICAgICAnICAgICAgICAgICAgICAgYWx0aG91Z2gg +aXQgbWF5IG5vdCBiZSBuZWVkZWQuDQogICAgICAgIElmIE1lIElzIERhb0hhbmRs +ZXIgVGhlbiAnYXBwbGllcyBvbmx5IGlmIGluc3RhbmNlIGlzIGlkZW50aWNhbCB0 +byBWQl9QcmVkZWNsYXJlZElkIGluc3RhbmNlDQogICAgICAgICcgICAgICAgICAg +ICAgICAgICAgICAgICAgRXZlcnkgb3RoZXIgaW5zdGFuY2Ugb2YgRGFvSGFuZGxl +ciBoYXMgZGlmZmVyZW50IG1lbW9yeSBhZGRyZXNzIChPYmpQdHIoTWUpIDw+IE9i +alB0cihEYW9IYW5kbGVyKSkuDQogICAgICAgICAgIFNldCBNZS5DdXJyZW50RGIg +PSBBcHBsaWNhdGlvbi5DdXJyZW50RGINCiAgICAgICAgRW5kIElmDQogICAgICAg +IEVuZCBJZg0KICAgIEVuZCBJZg0KICAgIFNldCBDdXJyZW50RGIgPSBtX0Rhb0Ri +DQpFbmQgUHJvcGVydHkNCg0KUHVibGljIFByb3BlcnR5IFNldCBDdXJyZW50RGIo +QnlSZWYgTmV3Q3VycmVudERiIEFzIERBTy5EYXRhYmFzZSkNCiAgICBTZXQgbV9E +YW9EYiA9IE5ld0N1cnJlbnREYg0KRW5kIFByb3BlcnR5DQoNCkZyaWVuZCBQcm9w +ZXJ0eSBHZXQgQ3VycmVudERiUmVmZXJlbmNlT25seSgpIEFzIERBTy5EYXRhYmFz +ZQ0KICAgIFNldCBDdXJyZW50RGJSZWZlcmVuY2VPbmx5ID0gbV9EYW9EYg0KRW5k +IFByb3BlcnR5DQoNCicjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQonIEdyb3VwOiBEYXRhIE9wZXJh +dGlvbnMNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJyBGdW5jdGlvbjogRXhlY3V0ZQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBFeGVjdXRlIFNRTCBzdGF0ZW1lbnQNCicN +CicgUGFyYW1ldGVyczoNCicgICAgIENvbW1hbmRUZXh0IC0gU1FMIHN0YXRlbWVu +dCAoU3RyaW5nKQ0KJyAgICAgT3B0aW9ucyAgICAgLSBEQU8uUmVjb3Jkc2V0T3B0 +aW9uRW51bQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgUmVjb3Jkc0FmZmVjdGVkIChM +b25nKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KUHVibGljIEZ1bmN0aW9uIEV4ZWN1dGUoQnlWYWwgUXVlcnkgQXMgU3RyaW5n +LCBfDQogICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBPcHRpb25zIEFzIERB +Ty5SZWNvcmRzZXRPcHRpb25FbnVtKSBBcyBMb25nDQoNCiAgICBJZiAoT3B0aW9u +cyBBbmQgZGJTZWVDaGFuZ2VzKSA9IDAgVGhlbg0KICAgICAgICBPcHRpb25zID0g +T3B0aW9ucyArIGRiU2VlQ2hhbmdlcw0KICAgIEVuZCBJZg0KICAgIE1lLkN1cnJl +bnREYi5FeGVjdXRlIFF1ZXJ5LCBPcHRpb25zDQogICAgRXhlY3V0ZSA9IE1lLkN1 +cnJlbnREYi5SZWNvcmRzQWZmZWN0ZWQNCiANCkVuZCBGdW5jdGlvbg0KDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9u +OiBFeGVjdXRlUGFyYW1TUUwNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicNCicgRXhlY3V0ZSBTUUwgc3RhdGVtZW50IHdpdGggcGFy +YW1ldGVycw0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgU3FsVGV4dCAgICAgLSBT +UUwgc3RhdGVtZW50DQonICAgICBRdWVyeVBhcmFtcyAtIFZhbHVlcyBpbiBzdWl0 +YWJsZSBvcmRlciBhcyBQYXJhbUFycmF5IG9yIGFzIGFycmF5IG9yIDItZGltZW5z +aW9uYWwgcGFyYW1ldGVyIGFycmF5IChBcnJheShuLDEpIC4uLiB4KG4sMCkgPSBw +YXJhbWV0ZXIgbmFtZSwgeChuLDEpID0gcGFyYW1ldGVyIHZhbHVlKSAuLi4gZ2Vu +ZXJhdGVhYmxlIHdpdGggR2V0UGFyYW1EZWZBcnJheSBvciBHZXROYW1lZFBhcmFt +RGVmQXJyYXkNCicNCicgUmV0dXJuczoNCicgICAgIFJlY29yZHNBZmZlY3RlZCAo +TG9uZykNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NClB1YmxpYyBGdW5jdGlvbiBFeGVjdXRlUGFyYW1TcWwoQnlWYWwgU3FsVGV4 +dCBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcmFt +QXJyYXkgUXVlcnlQYXJhbXMoKSBBcyBWYXJpYW50KSBBcyBMb25nDQogDQogICBE +aW0gcWRmIEFzIERBTy5RdWVyeURlZg0KDQpPbiBFcnJvciBHb1RvIEhhbmRsZUVy +cg0KDQogICBJZiBJc01pc3NpbmcoUXVlcnlQYXJhbXMpIFRoZW4NCiAgICAgIFNl +dCBxZGYgPSBNZS5QYXJhbVF1ZXJ5RGVmU3FsKFNxbFRleHQpDQogICBFbHNlDQog +ICAgICBTZXQgcWRmID0gTWUuUGFyYW1RdWVyeURlZlNxbChTcWxUZXh0LCBRdWVy +eVBhcmFtcykNCiAgIEVuZCBJZg0KICAgDQogICBFeGVjdXRlUGFyYW1TcWwgPSBF +eGVjdXRlUXVlcnlEZWYocWRmKQ0KDQpPbiBFcnJvciBHb1RvIDANCg0KICAgcWRm +LkNsb3NlDQogICBTZXQgcWRmID0gTm90aGluZw0KICAgDQpFeGl0SGVyZToNCiAg +IEV4aXQgRnVuY3Rpb24NCiAgIA0KSGFuZGxlRXJyOg0KICAgSWYgTm90IChxZGYg +SXMgTm90aGluZykgVGhlbg0KICAgICAgcWRmLkNsb3NlDQogICAgICBTZXQgcWRm +ID0gTm90aGluZw0KICAgRW5kIElmDQogICBFcnIuUmFpc2UgRXJyLk51bWJlciwg +IkV4ZWN1dGVQYXJhbVNRTDoiICYgRXJyLlNvdXJjZSwgRXJyLkRlc2NyaXB0aW9u +LCBFcnIuSGVscEZpbGUsIEVyci5IZWxwQ29udGV4dA0KIA0KRW5kIEZ1bmN0aW9u +DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +RnVuY3Rpb246IEV4ZWN1dGVRdWVyeURlZkJ5TmFtZQ0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBFeGVjdXRlIHNhdmVkIHF1 +ZXJ5IChvcHRpb25hbGx5IHdpdGggcGFyYW1ldGVycykNCicNCicgUGFyYW1ldGVy +czoNCicgICAgIFF1ZXJ5TmFtZSAgIC0gUXVlcnlEZWYgbmFtZQ0KJyAgICAgUXVl +cnlQYXJhbXMgLSBWYWx1ZXMgaW4gc3VpdGFibGUgb3JkZXIgYXMgUGFyYW1BcnJh +eSBvciBhcyBhcnJheQ0KJyAgICAgICAgICAgICAgICAgICBvciAyLWRpbWVuc2lv +bmFsIHBhcmFtZXRlciBhcnJheSAoQXJyYXkobiwxKSAuLi4geChuLDApID0gcGFy +YW1ldGVyIG5hbWUsIHgobiwxKSA9IHBhcmFtZXRlciB2YWx1ZSkgLi4uIGdlbmVy +YXRlYWJsZSB3aXRoIEdldFBhcmFtRGVmQXJyYXkgb3IgR2V0TmFtZWRQYXJhbURl +ZkFycmF5DQonDQonIFJldHVybnM6DQonICAgICBSZWNvcmRzQWZmZWN0ZWQgKExv +bmcpDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQpQdWJsaWMgRnVuY3Rpb24gRXhlY3V0ZVF1ZXJ5RGVmQnlOYW1lKEJ5VmFsIFF1 +ZXJ5TmFtZSBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgIFBhcmFtQXJyYXkgUXVlcnlQYXJhbXMoKSBBcyBWYXJpYW50KSBBcyBM +b25nDQogICANCiAgIERpbSBxZGYgQXMgREFPLlF1ZXJ5RGVmDQogDQpPbiBFcnJv +ciBHb1RvIEhhbmRsZUVycg0KIA0KICAgSWYgSXNNaXNzaW5nKFF1ZXJ5UGFyYW1z +KSBUaGVuDQogICAgICBTZXQgcWRmID0gTWUuUGFyYW1RdWVyeURlZkJ5TmFtZShR +dWVyeU5hbWUpDQogICBFbHNlDQogICAgICBTZXQgcWRmID0gTWUuUGFyYW1RdWVy +eURlZkJ5TmFtZShRdWVyeU5hbWUsIFF1ZXJ5UGFyYW1zKQ0KICAgRW5kIElmDQoN +CiAgIEV4ZWN1dGVRdWVyeURlZkJ5TmFtZSA9IEV4ZWN1dGVRdWVyeURlZihxZGYp +DQoNCk9uIEVycm9yIEdvVG8gMA0KDQogICBxZGYuQ2xvc2UNCiAgIFNldCBxZGYg +PSBOb3RoaW5nDQogICANCkV4aXRIZXJlOg0KICAgRXhpdCBGdW5jdGlvbg0KICAg +DQpIYW5kbGVFcnI6DQogICBJZiBOb3QgKHFkZiBJcyBOb3RoaW5nKSBUaGVuDQog +ICAgICBxZGYuQ2xvc2UNCiAgICAgIFNldCBxZGYgPSBOb3RoaW5nDQogICBFbmQg +SWYNCiAgIEVyci5SYWlzZSBFcnIuTnVtYmVyLCAiRXhlY3V0ZVBhcmFtUWRmQnlO +YW1lOiIgJiBFcnIuU291cmNlLCBFcnIuRGVzY3JpcHRpb24sIEVyci5IZWxwRmls +ZSwgRXJyLkhlbHBDb250ZXh0DQogDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogRXhl +Y3V0ZVF1ZXJ5RGVmDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonDQonIEZpbGwgUXVlcnlEZWYgb2JqZWN0IHdpdGggcGFyYW1ldGVy +IHZhbHVlcyBhbmQgdGhlbiBleGVjdXRlIGl0DQonDQonIFBhcmFtZXRlcnM6DQon +ICAgICBRZGZSZWYgICAgICAtIFF1ZXJ5RGVmIHJlZmVyZW5jZQ0KJyAgICAgUXVl +cnlQYXJhbXMgLSBWYWx1ZXMgaW4gc3VpdGFibGUgb3JkZXIgYXMgUGFyYW1BcnJh +eSBvciBhcyBhcnJheQ0KJyAgICAgICAgICAgICAgICAgICBvciAyLWRpbWVuc2lv +bmFsIHBhcmFtZXRlciBhcnJheSAoQXJyYXkobiwxKSAuLi4geChuLDApID0gcGFy +YW1ldGVyIG5hbWUsIHgobiwxKSA9IHBhcmFtZXRlciB2YWx1ZSkgLi4uIGdlbmVy +YXRlYWJsZSB3aXRoIEdldFBhcmFtRGVmQXJyYXkgb3IgR2V0TmFtZWRQYXJhbURl +ZkFycmF5DQonDQonIFJldHVybnM6DQonICAgICBSZWNvcmRzQWZmZWN0ZWQgKExv +bmcpDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQpQdWJsaWMgRnVuY3Rpb24gRXhlY3V0ZVF1ZXJ5RGVmKEJ5VmFsIFFkZlJlZiBB +cyBEQU8uUXVlcnlEZWYsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgUGFyYW1B +cnJheSBRdWVyeVBhcmFtcygpIEFzIFZhcmlhbnQpIEFzIExvbmcNCiANCiAgIERp +bSBRZGZQYXJhbURlZnMoKSBBcyBWYXJpYW50DQogICANCiAgIElmIE5vdCBJc01p +c3NpbmcoUXVlcnlQYXJhbXMpIFRoZW4NCiAgICAgIFFkZlBhcmFtRGVmcyA9IEdl +dFBhcmFtRGVmQXJyYXkoUXVlcnlQYXJhbXMpDQogICAgICBGaWxsUXVlcnlEZWZQ +YXJhbWV0ZXJzIFFkZlJlZiwgUWRmUGFyYW1EZWZzDQogICBFbmQgSWYNCiAgIA0K +ICAgUWRmUmVmLkV4ZWN1dGUgZGJGYWlsT25FcnJvcg0KICAgDQogICBFeGVjdXRl +UXVlcnlEZWYgPSBRZGZSZWYuUmVjb3Jkc0FmZmVjdGVkDQoNCkVuZCBGdW5jdGlv +bg0KDQpQcml2YXRlIFN1YiBGaWxsUXVlcnlEZWZQYXJhbWV0ZXJzKEJ5VmFsIFFk +ZlJlZiBBcyBEQU8uUXVlcnlEZWYsIEJ5VmFsIFFkZlBhcmFtRGVmcyBBcyBWYXJp +YW50KQ0KICAgDQogICBEaW0gUGFyYW1EZWZzQXJyYXlTaXplIEFzIExvbmcNCiAg +IERpbSBQYXJhbUluZGV4IEFzIFZhcmlhbnQNCiAgIERpbSBpIEFzIExvbmcNCg0K +ICAgUGFyYW1EZWZzQXJyYXlTaXplID0gVUJvdW5kKFFkZlBhcmFtRGVmcywgMSkN +CiAgIA0KICAgV2l0aCBRZGZSZWYNCiAgICAgIEZvciBpID0gMCBUbyBQYXJhbURl +ZnNBcnJheVNpemUNCiAgICAgICAgIFBhcmFtSW5kZXggPSBRZGZQYXJhbURlZnMo +aSwgMCkNCiAgICAgICAgIElmIExlbihQYXJhbUluZGV4KSA+IDAgVGhlbg0KICAg +ICAgICAgICAgLlBhcmFtZXRlcnMoUGFyYW1JbmRleCkuVmFsdWUgPSBRZGZQYXJh +bURlZnMoaSwgMSkNCiAgICAgICAgIEVuZCBJZg0KICAgICAgTmV4dCBpDQogICBF +bmQgV2l0aA0KICAgDQpFbmQgU3ViDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IFBhcmFtUXVlcnlEZWZCeU5h +bWUNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicN +CicgT3BlbiBzYXZlZCBxdWVyeSBhcyBRdWVyeURlZiBvYmplY3QgaW5jbC4gcGFz +c2VkIHBhcmFtZXRlciB2YWx1ZXMNCicNCicgUGFyYW1ldGVyczoNCicgICAgIFF1 +ZXJ5TmFtZSAgIC0gbmFtZSBvZiBxdWVyeSB3aXRoIHBhcmFtZXRlcnMNCicgICAg +IFF1ZXJ5UGFyYW1zIC0gVmFsdWVzIGluIHN1aXRhYmxlIG9yZGVyIGFzIFBhcmFt +QXJyYXkgb3IgYXMgYXJyYXkNCicgICAgICAgICAgICAgICAgICAgb3IgMi1kaW1l +bnNpb25hbCBwYXJhbWV0ZXIgYXJyYXkgKEFycmF5KG4sMSkgLi4uIHgobiwwKSA9 +IHBhcmFtZXRlciBuYW1lLCB4KG4sMSkgPSBwYXJhbWV0ZXIgdmFsdWUpIC4uLiBn +ZW5lcmF0ZWFibGUgd2l0aCBHZXRQYXJhbURlZkFycmF5IG9yIEdldE5hbWVkUGFy +YW1EZWZBcnJheQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgREFPLlF1ZXJ5RGVmDQon +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJs +aWMgRnVuY3Rpb24gUGFyYW1RdWVyeURlZkJ5TmFtZShCeVZhbCBRdWVyeU5hbWUg +QXMgU3RyaW5nLCBQYXJhbUFycmF5IFF1ZXJ5UGFyYW1zKCkgQXMgVmFyaWFudCkg +QXMgREFPLlF1ZXJ5RGVmDQoNCiAgIERpbSBxZGYgQXMgREFPLlF1ZXJ5RGVmDQog +ICBEaW0gUWRmUGFyYW1EZWZzKCkgQXMgVmFyaWFudA0KIA0KICAgU2V0IHFkZiA9 +IE1lLkN1cnJlbnREYi5RdWVyeURlZnMoUXVlcnlOYW1lKQ0KICAgSWYgTm90IElz +TWlzc2luZyhRdWVyeVBhcmFtcykgVGhlbg0KICAgICAgUWRmUGFyYW1EZWZzID0g +R2V0UGFyYW1EZWZBcnJheShRdWVyeVBhcmFtcykNCiAgICAgIEZpbGxRdWVyeURl +ZlBhcmFtZXRlcnMgcWRmLCBRZGZQYXJhbURlZnMNCiAgIEVuZCBJZg0KICAgDQog +ICBTZXQgUGFyYW1RdWVyeURlZkJ5TmFtZSA9IHFkZg0KDQpFbmQgRnVuY3Rpb24N +Cg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBG +dW5jdGlvbjogUGFyYW1RdWVyeURlZlNxbA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBUZW1wb3LkcmVzIFF1ZXJ5RGVmLU9i +amVrdCBpbmsuIPxiZXJnZWJlbmVuIFBhcmFtZXRlcndlcnRlbiD2ZmZuZW4NCicN +CicgUGFyYW1ldGVyczoNCicgICAgIFBhcmFtU3FsVGV4dCAgIC0gU1FMIHN0YXRl +bWVudCBmb3IgdGhlIHRlbXBvcmFyeSBRdWVyeURlZiBvYmplY3QNCicgICAgIFF1 +ZXJ5UGFyYW1zICAgIC0gVmFsdWVzIGluIHN1aXRhYmxlIG9yZGVyIGFzIFBhcmFt +QXJyYXkgb3IgYXMgYXJyYXkNCicgICAgICAgICAgICAgICAgICAgICAgb3IgMi1k +aW1lbnNpb25hbCBwYXJhbWV0ZXIgYXJyYXkgKEFycmF5KG4sMSkgLi4uIHgobiww +KSA9IHBhcmFtZXRlciBuYW1lLCB4KG4sMSkgPSBwYXJhbWV0ZXIgdmFsdWUpIC4u +LiBnZW5lcmF0ZWFibGUgd2l0aCBHZXRQYXJhbURlZkFycmF5IG9yIEdldE5hbWVk +UGFyYW1EZWZBcnJheQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgREFPLlF1ZXJ5RGVm +DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQ +dWJsaWMgRnVuY3Rpb24gUGFyYW1RdWVyeURlZlNxbChCeVZhbCBQYXJhbVNxbFRl +eHQgQXMgU3RyaW5nLCBQYXJhbUFycmF5IFF1ZXJ5UGFyYW1zKCkgQXMgVmFyaWFu +dCkgQXMgREFPLlF1ZXJ5RGVmDQoNCiAgIERpbSBxZGYgQXMgREFPLlF1ZXJ5RGVm +DQogICBEaW0gUWRmUGFyYW1EZWZzKCkgQXMgVmFyaWFudA0KDQogICBTZXQgcWRm +ID0gTWUuQ3VycmVudERiLkNyZWF0ZVF1ZXJ5RGVmKCIiLCBQYXJhbVNxbFRleHQp +DQogICBJZiBOb3QgSXNNaXNzaW5nKFF1ZXJ5UGFyYW1zKSBUaGVuDQogICAgICBR +ZGZQYXJhbURlZnMgPSBHZXRQYXJhbURlZkFycmF5KFF1ZXJ5UGFyYW1zKQ0KICAg +ICAgRmlsbFF1ZXJ5RGVmUGFyYW1ldGVycyBxZGYsIFFkZlBhcmFtRGVmcw0KICAg +RW5kIElmDQogICANCiAgIFNldCBQYXJhbVF1ZXJ5RGVmU3FsID0gcWRmDQoNCkVu +ZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonIEZ1bmN0aW9uOiBPcGVuUmVjb3Jkc2V0DQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIE9wZW4gREFPLlJlY29y +ZHNldA0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgU291cmNlICAgICAgICAgICAg +LSBTUUwgc3RhdGVtZW50IG9yIHRhYmxlIG9yIHF1ZXJ5IG5hbWUNCicgICAgIFJl +Y29yZHNldFR5cGUgICAgIC0gREFPLlJlY29yZHNldFR5cGVFbnVtIChTdGFuZGFy +ZDogZGJPcGVuRHluYXNldCkNCicgICAgIFJlY29yZHNldE9wdGlvbnMgIC0gREFP +LlJlY29yZHNldE9wdGlvbkVudW0gKFN0YW5kYXJkOiBkYlNlZUNoYW5nZXMpDQon +ICAgICBMb2NrRWRpdCAgICAgICAgICAtIERBTy5Mb2NrVHlwZUVudW0gKFN0YW5k +YXJkOiBkYk9wdGltaXN0aWMpDQonDQonIFJldHVybnM6DQonICAgICBEQU8uUmVj +b3Jkc2V0DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQpQdWJsaWMgRnVuY3Rpb24gT3BlblJlY29yZHNldChCeVZhbCBTb3VyY2Ug +QXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZh +bCBSZWNvcmRzZXRUeXBlIEFzIERBTy5SZWNvcmRzZXRUeXBlRW51bSA9IGRiT3Bl +bkR5bmFzZXQsIF8NCiAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFs +IFJlY29yZHNldE9wdGlvbnMgQXMgREFPLlJlY29yZHNldE9wdGlvbkVudW0gPSBE +QU8uUmVjb3Jkc2V0T3B0aW9uRW51bS5kYlNlZUNoYW5nZXMsIF8NCiAgICAgICAg +ICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIExvY2tFZGl0IEFzIERBTy5Mb2Nr +VHlwZUVudW0pIEFzIERBTy5SZWNvcmRzZXQNCg0KICAgSWYgKFJlY29yZHNldE9w +dGlvbnMgQW5kIGRiU2VlQ2hhbmdlcykgPSAwIFRoZW4NCiAgICAgIFJlY29yZHNl +dE9wdGlvbnMgPSBSZWNvcmRzZXRPcHRpb25zICsgZGJTZWVDaGFuZ2VzDQogICBF +bmQgSWYNCiAgIA0KICAgJyBSZXBsYWNlMFdpdGhJc01pc3NpbmcgLi4uIHNvIHRo +YXQgSXNNaXNzaW5nIGZvciBWYXJpYW50IGRhdGEgdHlwZSB3b3JrcyBvbiBvcmln +aW5hbCBEQU8gb3BlbnJlY29yZHNldA0KICAgU2V0IE9wZW5SZWNvcmRzZXQgPSBN +ZS5DdXJyZW50RGIuT3BlblJlY29yZHNldChTb3VyY2UsIF8NCiAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwbGFjZTBX +aXRoSXNNaXNzaW5nKFJlY29yZHNldFR5cGUpLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGxhY2UwV2l0aElz +TWlzc2luZyhSZWNvcmRzZXRPcHRpb25zKSwgXw0KICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBsYWNlMFdpdGhJc01p +c3NpbmcoTG9ja0VkaXQpKQ0KDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5j +dGlvbiBSZXBsYWNlMFdpdGhJc01pc3NpbmcoQnlWYWwgQ2hlY2tWYWx1ZSBBcyBM +b25nKSBBcyBWYXJpYW50DQogICBJZiBDaGVja1ZhbHVlID0gMCBUaGVuDQogICAg +ICBSZXBsYWNlMFdpdGhJc01pc3NpbmcgPSBHZXRJc01pc3NpbmcoKQ0KICAgRWxz +ZQ0KICAgICAgUmVwbGFjZTBXaXRoSXNNaXNzaW5nID0gQ2hlY2tWYWx1ZQ0KICAg +RW5kIElmDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBHZXRJc01p +c3NpbmcoT3B0aW9uYWwgQnlWYWwgRG9Ob3RGaWxsVGhpc1BhcmFtIEFzIFZhcmlh +bnQpIEFzIFZhcmlhbnQNCiAgIEdldElzTWlzc2luZyA9IERvTm90RmlsbFRoaXNQ +YXJhbQ0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IE9wZW5SZWNvcmRzZXRQYXJhbVNR +TA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0K +JyBPcGVuIHBhcmFtZXRlciBTUUwgc3RhdGVtZW50ICh1c2VzIHRlbXBvcmFyeSBR +dWVyeURlZikNCicNCicgUGFyYW1ldGVyczoNCicgICAgIFBhcmFtU3FsVGV4dCAg +ICAgIC0gU1FMIHN0YXRlbWVudCB3aXRoIHBhcmFtZXRlcnMgKHBhcmFtZXRlciBk +ZWNsYXJhdGlvbikNCicgICAgIFJlY29yZHNldFR5cGUgICAgIC0gREFPLlJlY29y +ZHNldFR5cGVFbnVtIChTdGFuZGFyZDogZGJPcGVuRHluYXNldCkNCicgICAgIFJl +Y29yZHNldE9wdGlvbnMgIC0gREFPLlJlY29yZHNldE9wdGlvbkVudW0gKFN0YW5k +YXJkOiBkYlNlZUNoYW5nZXMpDQonICAgICBMb2NrRWRpdCAgICAgICAgICAtIERB +Ty5Mb2NrVHlwZUVudW0gKFN0YW5kYXJkOiBkYk9wdGltaXN0aWMpDQonICAgICBR +dWVyeVBhcmFtcyAgICAgICAtIFZhbHVlcyBpbiBzdWl0YWJsZSBvcmRlciBhcyBQ +YXJhbUFycmF5IG9yIGFzIGFycmF5DQonICAgICAgICAgICAgICAgICAgICAgICAg +IG9yIDItZGltZW5zaW9uYWwgcGFyYW1ldGVyIGFycmF5IChBcnJheShuLDEpIC4u +LiB4KG4sMCkgPSBwYXJhbWV0ZXIgbmFtZSwgeChuLDEpID0gcGFyYW1ldGVyIHZh +bHVlKSAuLi4gZ2VuZXJhdGVhYmxlIHdpdGggR2V0UGFyYW1EZWZBcnJheSBvciBH +ZXROYW1lZFBhcmFtRGVmQXJyYXkNCicNCicgUmV0dXJuczoNCicgICAgIERBTy5S +ZWNvcmRzZXQNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NClB1YmxpYyBGdW5jdGlvbiBPcGVuUmVjb3Jkc2V0UGFyYW1TcWwoQnlW +YWwgUGFyYW1TcWxUZXh0IEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAg +ICAgQnlWYWwgUmVjb3Jkc2V0VHlwZSBBcyBEQU8uUmVjb3Jkc2V0VHlwZUVudW0s +IF8NCiAgICAgICAgICAgICAgICAgICAgIEJ5VmFsIE9wdGlvbnMgQXMgREFPLlJl +Y29yZHNldE9wdGlvbkVudW0sIF8NCiAgICAgICAgICAgICAgICAgICAgIEJ5VmFs +IExvY2tFZGl0IEFzIERBTy5Mb2NrVHlwZUVudW0sIF8NCiAgICAgICAgICAgICAg +ICAgICAgIFBhcmFtQXJyYXkgUXVlcnlQYXJhbXMoKSBBcyBWYXJpYW50KSBBcyBE +QU8uUmVjb3Jkc2V0DQoNCiAgIERpbSBxZGYgQXMgREFPLlF1ZXJ5RGVmDQogICBE +aW0gUWRmUGFyYW1EZWZzIEFzIFZhcmlhbnQgJw0KICAgDQogICBRZGZQYXJhbURl +ZnMgPSBHZXRQYXJhbURlZkFycmF5KFF1ZXJ5UGFyYW1zKQ0KICAgDQpPbiBFcnJv +ciBHb1RvIEhhbmRsZUVycg0KICAgDQogICBTZXQgcWRmID0gTWUuQ3VycmVudERi +LkNyZWF0ZVF1ZXJ5RGVmKCIiLCBQYXJhbVNxbFRleHQpDQogICBTZXQgT3BlblJl +Y29yZHNldFBhcmFtU3FsID0gT3BlblJlY29yZHNldFF1ZXJ5RGVmKHFkZiwgUWRm +UGFyYW1EZWZzLCBSZWNvcmRzZXRUeXBlLCBPcHRpb25zLCBMb2NrRWRpdCkNCiAg +IA0KT24gRXJyb3IgR29UbyAwDQoNCiAgIHFkZi5DbG9zZQ0KICAgU2V0IHFkZiA9 +IE5vdGhpbmcNCiAgIA0KRXhpdEhlcmU6DQogICBFeGl0IEZ1bmN0aW9uDQogICAN +CkhhbmRsZUVycjoNCiAgIElmIE5vdCAocWRmIElzIE5vdGhpbmcpIFRoZW4NCiAg +ICAgIHFkZi5DbG9zZQ0KICAgICAgU2V0IHFkZiA9IE5vdGhpbmcNCiAgIEVuZCBJ +Zg0KICAgRXJyLlJhaXNlIEVyci5OdW1iZXIsICJPcGVuUmVjb3Jkc2V0UGFyYW1T +UUw6IiAmIEVyci5Tb3VyY2UsIEVyci5EZXNjcmlwdGlvbiwgRXJyLkhlbHBGaWxl +LCBFcnIuSGVscENvbnRleHQNCiANCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBPcGVu +UmVjb3Jkc2V0UGFyYW1TcWwyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonDQonIE9wZW4gcGFyYW1ldGVyIFNRTCBzdGF0ZW1lbnQg +KGxpa2UgT3BlblJlY29yZHNldFBhcmFtU1FMLCBidXQgd2l0aCBkZWZhdWx0IHZh +bHVlcyBmb3IgUmVjb3Jkc2V0VHlwZSwgUmVjb3Jkc2V0T3B0aW9ucyBhbmQgTG9j +a0VkaXQpDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBQYXJhbVNxbFRleHQgICAt +IFNRTCBzdGF0ZW1lbnQgd2l0aCBwYXJhbWV0ZXJzIChwYXJhbWV0ZXIgZGVjbGFy +YXRpb24pDQonICAgICBRdWVyeVBhcmFtcyAgICAtIFZhbHVlcyBpbiBzdWl0YWJs +ZSBvcmRlciBhcyBQYXJhbUFycmF5IG9yIGFzIGFycmF5DQonICAgICAgICAgICAg +ICAgICAgICAgIG9yIDItZGltZW5zaW9uYWwgcGFyYW1ldGVyIGFycmF5IChBcnJh +eShuLDEpIC4uLiB4KG4sMCkgPSBwYXJhbWV0ZXIgbmFtZSwgeChuLDEpID0gcGFy +YW1ldGVyIHZhbHVlKSAuLi4gZ2VuZXJhdGVhYmxlIHdpdGggR2V0UGFyYW1EZWZB +cnJheSBvciBHZXROYW1lZFBhcmFtRGVmQXJyYXknDQonDQonIFJldHVybnM6DQon +ICAgICBEQU8uUmVjb3Jkc2V0DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gT3BlblJlY29yZHNldFBh +cmFtU3FsMihCeVZhbCBQYXJhbVNxbFRleHQgQXMgU3RyaW5nLCBfDQogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUFycmF5IFF1ZXJ5 +UGFyYW1zKCkgQXMgVmFyaWFudCkgQXMgREFPLlJlY29yZHNldA0KDQogICBTZXQg +T3BlblJlY29yZHNldFBhcmFtU3FsMiA9IE9wZW5SZWNvcmRzZXRQYXJhbVNxbChQ +YXJhbVNxbFRleHQsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgIG1fUmVjb3Jkc2V0VHlwZUVudW1EZWZhdWx0 +LCBtX1JlY29yZHNldE9wdGlvbkVudW1EZWZhdWx0LCBtX0xvY2tUeXBlRW51bURl +ZmF1bHQsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIFF1ZXJ5UGFyYW1zKQ0KDQpFbmQgRnVuY3Rpb24NCg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5j +dGlvbjogR2V0UGFyYW1EZWZBcnJheQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBDcmVhdGVzIDItZGltZW5zaW9uYWwgcGFy +YW1ldGVyIGFycmF5IChlLmcuIGZvciBPcGVuUmVjb3Jkc2V0UXVlcnlEZWYpDQon +DQonIFBhcmFtZXRlcnM6DQonICAgICBQYXJhbVZhbHVlcyAtIFBhcm1ldGVyIHZh +bHVlcyBpbiBtYXRjaGluZyBvcmRlciAod2l0aG91dCBpbmRleCBpZGVudGlmaWVy +ISkNCicNCicgUmV0dXJuczoNCicgICAgIFZhcmlhbnQgKEFycmF5KQ0KJw0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1 +bmN0aW9uIEdldFBhcmFtRGVmQXJyYXkoUGFyYW1BcnJheSBQYXJhbVZhbHVlcygp +IEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQNCiAgIA0KICAgRGltIGkgQXMgTG9uZw0K +ICAgRGltIFFkZlBhcmFtRGVmcygpIEFzIFZhcmlhbnQNCiAgIERpbSBBcnJheVNp +emUgQXMgTG9uZw0KICAgRGltIFBhcmFtVmFsdWVBcnJheSBBcyBWYXJpYW50ICAn +ICEhISBuaWNodCBhbHMgQXJyYXkgZGVrbGFyaWVyZW4sIGRhIHNvbnN0IFBhcmFt +VmFsdWVBcnJheSA9IFBhcmFtVmFsdWVBcnJheSgwKSBmZWhsdHNjaGzkZ3QsIHdl +bm4gUGFyYW1WYWx1ZUFycmF5KDApIGVpbiBBcnJheSBpc3QNCiAgIERpbSBBcnJh +eURpbUNudCBBcyBMb25nLCBTdWJBcnJheURpbUNudCBBcyBMb25nDQogICANCiAg +IEFycmF5U2l6ZSA9IFVCb3VuZChQYXJhbVZhbHVlcykNCiAgIElmIEFycmF5U2l6 +ZSA9IC0xIFRoZW4NCiAgICAgIEdldFBhcmFtRGVmQXJyYXkgPSBRZGZQYXJhbURl +ZnMgJ25pY2h0IGRpbWVuc2lvbmllcnRlbiBBcnJheSB6dXL8Y2tnZWJlbg0KICAg +ICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIFBhcmFtVmFsdWVB +cnJheSA9IFBhcmFtVmFsdWVzDQogICBBcnJheURpbUNudCA9IEFycmF5RGltZW5z +aW9uQ291bnQoUGFyYW1WYWx1ZUFycmF5KQ0KICAgSWYgQXJyYXlEaW1DbnQgPSAy +IFRoZW4NCiAgICAgIEdldFBhcmFtRGVmQXJyYXkgPSBQYXJhbVZhbHVlcw0KICAg +ICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIFN1YkFycmF5RGlt +Q250ID0gQXJyYXlEaW1lbnNpb25Db3VudChQYXJhbVZhbHVlQXJyYXkoMCkpDQog +ICBJZiBTdWJBcnJheURpbUNudCA8PiAtMSBUaGVuDQogICANCiAgICAgIERvIFdo +aWxlIFN1YkFycmF5RGltQ250IDw+IC0xDQogICAgICANCiAgICAgICAgIFBhcmFt +VmFsdWVBcnJheSA9IFBhcmFtVmFsdWVBcnJheSgwKQ0KICAgICAgDQogICAgICAg +ICBJZiBTdWJBcnJheURpbUNudCA9IDIgVGhlbiAgJyAhISEgLyoqIFx0b2RvIENI +RUNLIFN1YkFycmF5RGltQ250ID0gMjE3NiAuLiBpc3QgZGFzIGltbWVyIHJpY2h0 +aWc/ICoqLw0KICAgICAgICAgJ0JlcmVpdHMgYXVmYmVyZWl0ZXRlciAyLWRpbS4g +QXJyYXkNCiAgICAgICAgICAgICAgICAgIEdldFBhcmFtRGVmQXJyYXkgPSBQYXJh +bVZhbHVlQXJyYXkNCiAgICAgICAgICAgICAgICAgIEV4aXQgRnVuY3Rpb24NCiAg +ICAgICAgIEVuZCBJZg0KICAgICAgICAgDQogICAgICAgICBTdWJBcnJheURpbUNu +dCA9IEFycmF5RGltZW5zaW9uQ291bnQoUGFyYW1WYWx1ZUFycmF5KDApKQ0KICAg +ICAgICAgDQogICAgICBMb29wDQogICAgICANCiAgICAgIEFycmF5U2l6ZSA9IFVC +b3VuZChQYXJhbVZhbHVlQXJyYXkpDQogICAgICANCiAgIEVuZCBJZg0KICAgDQog +ICBSZURpbSBRZGZQYXJhbURlZnMoQXJyYXlTaXplLCAxKQ0KDQogICBGb3IgaSA9 +IDAgVG8gQXJyYXlTaXplDQogICAgICBRZGZQYXJhbURlZnMoaSwgMCkgPSBpDQog +ICAgICBRZGZQYXJhbURlZnMoaSwgMSkgPSBQYXJhbVZhbHVlQXJyYXkoaSkNCiAg +IE5leHQNCiAgIA0KICAgR2V0UGFyYW1EZWZBcnJheSA9IFFkZlBhcmFtRGVmcw0K +ICAgDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBBcnJheURpbWVu +c2lvbkNvdW50KEJ5UmVmIEFycmF5VG9DaGVjayBBcyBWYXJpYW50KSBBcyBJbnRl +Z2VyDQonIHNpZWhlIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZGUtZGUvbGli +cmFyeS9iYjk3ODkwMi5hc3B4IC4uIEZ1bmt0aW9uaWVydCBuaWNodCwgd2VubiBB +cnJheSBpbiBWYXJpYW50IGVpbmdlYmV0dGV0IGlzdA0KDQonICAgRGltIGxuZ0Nu +dCBBcyBJbnRlZ2VyDQonICAgRGltIGxwU0FEZXNjcmlwdG9yIEFzIExvbmcsIGxw +U2FmZUFycmF5IEFzIExvbmcNCicNCidPbiBFcnJvciBSZXN1bWUgTmV4dA0KJw0K +JyAgIElmIE5vdCBJc0FycmF5KEFycmF5VG9DaGVjaykgVGhlbg0KJyAgICAgIEFy +cmF5RGltZW5zaW9uQ291bnQgPSAtMQ0KJyAgICAgIEV4aXQgRnVuY3Rpb24NCicg +ICBFbmQgSWYNCicNCicgICAnIEFkcmVzc2UgZGVzIFNBRkVBUlJBWS1EZXNrcmlw +dG9ycyBob2xlbg0KJyAgIENvcHlNZW1vcnkgbHBTQURlc2NyaXB0b3IsIEJ5VmFs +IFZhclB0cihBcnJheVRvQ2hlY2spICsgOCwgNA0KJyAgICcgQWRyZXNzZSBkZXIg +U0FGRUFSUkFZLVN0cnVrdHVyIGhvbGVuDQonICAgQ29weU1lbW9yeSBscFNhZmVB +cnJheSwgQnlWYWwgbHBTQURlc2NyaXB0b3IsIDQNCicNCicgICBJZiBscFNhZmVB +cnJheSA8PiAwIFRoZW4NCicgICAgICAnIERpZSBlcnN0ZW4gendlaSBCeXRlcyBl +bnRoYWx0ZW4gZGllIEFuemFobCBkZXIgRGltZW5zaW9uZW46DQonICAgICAgQ29w +eU1lbW9yeSBsbmdDbnQsIEJ5VmFsIGxwU2FmZUFycmF5LCAyDQonICAgRW5kIElm +DQonDQonICAgQXJyYXlEaW1lbnNpb25Db3VudCA9IGxuZ0NudA0KICAgDQogICBE +aW0gQXJyYXlTaXplIEFzIExvbmcNCiAgIERpbSBEaW1DbnQgQXMgTG9uZw0KICAg +DQogICBEaW1DbnQgPSAwDQogICANCiAgIElmIE5vdCBJc0FycmF5KEFycmF5VG9D +aGVjaykgVGhlbg0KICAgICAgQXJyYXlEaW1lbnNpb25Db3VudCA9IC0xDQogICAg +ICBFeGl0IEZ1bmN0aW9uDQogICBFbmQgSWYNCiAgIA0KT24gRXJyb3IgUmVzdW1l +IE5leHQNCg0KICAgRG8NCiAgICAgIERpbUNudCA9IERpbUNudCArIDENCiAgICAg +IEFycmF5U2l6ZSA9IFVCb3VuZChBcnJheVRvQ2hlY2ssIERpbUNudCkNCiAgIExv +b3AgV2hpbGUgRXJyLk51bWJlciA9IDANCiAgIEVyci5DbGVhcg0KICAgDQpPbiBF +cnJvciBHb1RvIDANCiAgIA0KICAgRGltQ250ID0gRGltQ250IC0gMQ0KICAgDQog +ICBBcnJheURpbWVuc2lvbkNvdW50ID0gRGltQ250DQogICANCkVuZCBGdW5jdGlv +bg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQon +IEZ1bmN0aW9uOiBHZXROYW1lZFBhcmFtRGVmQXJyYXkNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQ3JlYXRlcyAyLWRpbWVu +c2lvbmFsIHBhcmFtZXRlciBhcnJheSAoZS5nLiBmb3IgT3BlblJlY29yZHNldFF1 +ZXJ5RGVmKQ0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgUGFyYW1WYWx1ZXMgLSBQ +YXJhbWV0ZXIgcGFpcnM6IGFsdGVybmF0aW5nIHBhcmFtZXRlciBpbmRleCBhbmQg +cGFyYW1ldGVyIHZhbHVlDQonDQonIFJldHVybnM6DQonICAgICBWYXJpYW50IChB +cnJheSkNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NClB1YmxpYyBGdW5jdGlvbiBHZXROYW1lZFBhcmFtRGVmQXJyYXkoUGFyYW1B +cnJheSBQYXJhbUluZGV4QW5kVmFsdWVzKCkgQXMgVmFyaWFudCkgQXMgVmFyaWFu +dA0KICAgDQogICBEaW0gaSBBcyBMb25nDQogICBEaW0gUWRmUGFyYW1EZWZzKCkg +QXMgVmFyaWFudA0KICAgRGltIEFycmF5U2l6ZSBBcyBMb25nDQogICANCiAgIEFy +cmF5U2l6ZSA9IFVCb3VuZChQYXJhbUluZGV4QW5kVmFsdWVzKQ0KICAgSWYgQXJy +YXlTaXplID0gLTEgVGhlbg0KICAgICAgR2V0TmFtZWRQYXJhbURlZkFycmF5ID0g +UWRmUGFyYW1EZWZzICduaWNodCBkaW1lbnNpb25pZXJ0ZW4gQXJyYXkgenVy/GNr +Z2ViZW4NCiAgICAgIEV4aXQgRnVuY3Rpb24NCiAgIEVuZCBJZg0KICAgDQogICAn +UHL8ZmVuLCBvYiBpbW1lciBQYWFyZSAoSW5kZXggLyBXZXJ0KSBt9mdsaWNoIHNp +bmQNCiAgIElmICgoKEFycmF5U2l6ZSArIDEpIFwgMikgKiAyKSA8PiAoQXJyYXlT +aXplICsgMSkgVGhlbg0KICAgICAgRXJyLlJhaXNlIHZiT2JqZWN0RXJyb3IsICJE +YW9IYW5kbGVyLkdldE5hbWVkUGFyYW1EZWZBcnJheSIsICJQYXJhbUFycmF5IG11 +c3MgaW1tZXIgUGFhcmUgZvxyIFBhcmFtZXRlci1JbmRleCB1bmQgUGFyYW1ldGVy +LVdlcnQgZW50aGFsdGVuLiINCiAgIEVuZCBJZg0KICAgDQogICBBcnJheVNpemUg +PSBBcnJheVNpemUgXCAyDQogICANCiAgIFJlRGltIFFkZlBhcmFtRGVmcyhBcnJh +eVNpemUsIDEpDQoNCiAgIEZvciBpID0gMCBUbyBBcnJheVNpemUNCiAgICAgIFFk +ZlBhcmFtRGVmcyhpLCAwKSA9IFBhcmFtSW5kZXhBbmRWYWx1ZXMoaSAqIDIpDQog +ICAgICBRZGZQYXJhbURlZnMoaSwgMSkgPSBQYXJhbUluZGV4QW5kVmFsdWVzKGkg +KiAyICsgMSkNCiAgIE5leHQNCiAgIA0KICAgR2V0TmFtZWRQYXJhbURlZkFycmF5 +ID0gUWRmUGFyYW1EZWZzDQogICANCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBPcGVu +UmVjb3Jkc2V0UXVlcnlEZWZCeU5hbWUNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicNCicgT3BlbiByZWNvcmRzZXQgZnJvbSBzYXZl +ZCBxdWVyeSAob3B0aW9uYWxseSB3aXRoIHBhcmFtZXRlcnMpDQonDQonIFBhcmFt +ZXRlcnM6DQonICAgICBRdWVyeU5hbWUgICAgICAgICAtIE5hbWUgb2YgdGhlIHNh +dmVkIHF1ZXJ5DQonICAgICBRdWVyeVBhcmFtcyAgICAgICAtIFZhbHVlcyBpbiBz +dWl0YWJsZSBvcmRlciBhcyBQYXJhbUFycmF5IG9yIGFzIGFycmF5DQonICAgICAg +ICAgICAgICAgICAgICAgICAgIG9yIDItZGltZW5zaW9uYWwgcGFyYW1ldGVyIGFy +cmF5IChBcnJheShuLDEpIC4uLiB4KG4sMCkgPSBwYXJhbWV0ZXIgbmFtZSwgeChu +LDEpID0gcGFyYW1ldGVyIHZhbHVlKSAuLi4gZ2VuZXJhdGVhYmxlIHdpdGggR2V0 +UGFyYW1EZWZBcnJheSBvciBHZXROYW1lZFBhcmFtRGVmQXJyYXknDQonICAgICBS +ZWNvcmRzZXRUeXBlICAgICAtIERBTy5SZWNvcmRzZXRUeXBlRW51bSAoU3RhbmRh +cmQ6IGRiT3BlbkR5bmFzZXQpDQonICAgICBSZWNvcmRzZXRPcHRpb25zICAtIERB +Ty5SZWNvcmRzZXRPcHRpb25FbnVtIChTdGFuZGFyZDogZGJTZWVDaGFuZ2VzKQ0K +JyAgICAgTG9ja0VkaXQgICAgICAgICAgLSBEQU8uTG9ja1R5cGVFbnVtIChTdGFu +ZGFyZDogZGJPcHRpbWlzdGljKQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgREFPLlJl +Y29yZHNldA0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KUHVibGljIEZ1bmN0aW9uIE9wZW5SZWNvcmRzZXRRdWVyeURlZkJ5TmFt +ZShCeVZhbCBRdWVyeU5hbWUgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIFF1ZXJ5UGFyYW1zIEFzIFZhcmlh +bnQsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlW +YWwgUmVjb3Jkc2V0VHlwZSBBcyBEQU8uUmVjb3Jkc2V0VHlwZUVudW0sIF8NCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgT3B0aW9u +cyBBcyBEQU8uUmVjb3Jkc2V0T3B0aW9uRW51bSwgXw0KICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBMb2NrRWRpdCBBcyBEQU8uTG9j +a1R5cGVFbnVtKSBBcyBEQU8uUmVjb3Jkc2V0DQoNCiAgIERpbSBxZGYgQXMgREFP +LlF1ZXJ5RGVmDQoNCk9uIEVycm9yIEdvVG8gSGFuZGxlRXJyDQogDQogICBTZXQg +cWRmID0gTWUuQ3VycmVudERiLlF1ZXJ5RGVmcyhRdWVyeU5hbWUpDQogICBTZXQg +T3BlblJlY29yZHNldFF1ZXJ5RGVmQnlOYW1lID0gT3BlblJlY29yZHNldFF1ZXJ5 +RGVmKHFkZiwgUXVlcnlQYXJhbXMsIFJlY29yZHNldFR5cGUsIE9wdGlvbnMsIExv +Y2tFZGl0KQ0KDQpPbiBFcnJvciBHb1RvIDANCg0KICAgcWRmLkNsb3NlDQogICBT +ZXQgcWRmID0gTm90aGluZw0KICAgDQpFeGl0SGVyZToNCiAgIEV4aXQgRnVuY3Rp +b24NCiAgIA0KSGFuZGxlRXJyOg0KICAgSWYgTm90IChxZGYgSXMgTm90aGluZykg +VGhlbg0KICAgICAgcWRmLkNsb3NlDQogICAgICBTZXQgcWRmID0gTm90aGluZw0K +ICAgRW5kIElmDQogICBFcnIuUmFpc2UgRXJyLk51bWJlciwgIk9wZW5RdWVyeURl +ZlJlY29yZHNldEJ5TmFtZToiICYgRXJyLlNvdXJjZSwgRXJyLkRlc2NyaXB0aW9u +LCBFcnIuSGVscEZpbGUsIEVyci5IZWxwQ29udGV4dA0KIA0KRW5kIEZ1bmN0aW9u +DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +RnVuY3Rpb246IE9wZW5SZWNvcmRzZXRRdWVyeURlZg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBSZWNvcmRzZXQgdm9uIGdl +c3BlaWNoZXJ0ZXIgQWJmcmFnZSAob3B0aW9uYWwgbWl0IFBhcmFtZXRlcm4pIPZm +Zm5lbg0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgUWRmUmVmICAgICAgICAgICAg +LSBRdWVyeURlZiByZWZlcmVuY2UNCicgICAgIFF1ZXJ5UGFyYW1zICAgICAgIC0g +VmFsdWVzIGluIHN1aXRhYmxlIG9yZGVyIGFzIFBhcmFtQXJyYXkgb3IgYXMgYXJy +YXkNCicgICAgICAgICAgICAgICAgICAgICAgICAgb3IgMi1kaW1lbnNpb25hbCBw +YXJhbWV0ZXIgYXJyYXkgKEFycmF5KG4sMSkgLi4uIHgobiwwKSA9IHBhcmFtZXRl +ciBuYW1lLCB4KG4sMSkgPSBwYXJhbWV0ZXIgdmFsdWUpIC4uLiBnZW5lcmF0ZWFi +bGUgd2l0aCBHZXRQYXJhbURlZkFycmF5IG9yIEdldE5hbWVkUGFyYW1EZWZBcnJh +eScNCicgICAgIFJlY29yZHNldFR5cGUgICAgIC0gREFPLlJlY29yZHNldFR5cGVF +bnVtIChTdGFuZGFyZDogZGJPcGVuRHluYXNldCkNCicgICAgIFJlY29yZHNldE9w +dGlvbnMgIC0gREFPLlJlY29yZHNldE9wdGlvbkVudW0gKFN0YW5kYXJkOiBkYlNl +ZUNoYW5nZXMpDQonICAgICBMb2NrRWRpdCAgICAgICAgICAtIERBTy5Mb2NrVHlw +ZUVudW0gKFN0YW5kYXJkOiBkYk9wdGltaXN0aWMpDQonDQonIFJldHVybnM6DQon +ICAgICBEQU8uUmVjb3Jkc2V0DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gT3BlblJlY29yZHNldFF1 +ZXJ5RGVmKEJ5VmFsIFFkZlJlZiBBcyBEQU8uUXVlcnlEZWYsIF8NCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgUXVlcnlQYXJhbXMg +QXMgVmFyaWFudCwgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRp +b25hbCBCeVZhbCBSZWNvcmRzZXRUeXBlIEFzIERBTy5SZWNvcmRzZXRUeXBlRW51 +bSwgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZh +bCBSZWNvcmRzZXRPcHRpb25zIEFzIERBTy5SZWNvcmRzZXRPcHRpb25FbnVtLCBf +DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIExv +Y2tFZGl0IEFzIERBTy5Mb2NrVHlwZUVudW0pIEFzIERBTy5SZWNvcmRzZXQNCiAN +CiAgIElmIE5vdCBJc01pc3NpbmcoUXVlcnlQYXJhbXMpIFRoZW4NCiAgICAgIEZp +bGxRdWVyeURlZlBhcmFtZXRlcnMgUWRmUmVmLCBRdWVyeVBhcmFtcw0KICAgRW5k +IElmDQoNCiAgIFNldCBPcGVuUmVjb3Jkc2V0UXVlcnlEZWYgPSBRZGZSZWYuT3Bl +blJlY29yZHNldChSZXBsYWNlMFdpdGhJc01pc3NpbmcoUmVjb3Jkc2V0VHlwZSks +IF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBSZXBsYWNlMFdpdGhJc01pc3NpbmcoUmVjb3Jkc2V0T3B0aW9ucyksIF8N +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICBSZXBsYWNlMFdpdGhJc01pc3NpbmcoTG9ja0VkaXQpKQ0KDQpFbmQgRnVuY3Rp +b24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +JyBGdW5jdGlvbjogTG9va3VwU1FMDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonDQonIExvb2t1cCBEQU8uUmVjb3Jkc2V0IHJlcGxh +Y2VtZW50IGZ1bmN0aW9uIGZvciBETG9va3VwIChwYXNzaW5nIGEgU1FMIHN0YXRl +bWVudCkNCicNCicgUGFyYW1ldGVyczoNCicgICAgIFNxbFRleHQgICAgIC0gU1FM +IHN0YXRlbWVudA0KJyAgICAgSW5kZXggICAgICAgLSBGaWVsZCBzZWxlY3Rpb24g +aWYgdGhlIGZpcnN0IGZpZWxkIG9mIHRoZSByZWNvcmRzZXQgaXMgbm90IHRvIGJl +IHJldHVybmVkLg0KJyAgICAgICAgICAgICAgICAgICBUaGUgaW5kZXggaXMgcGFz +c2VkIGluIHRoZSBzYW1lIHdheSBhcyBEQU8uUmVjb3Jkc2V0LkZpZWxkcyhpbmRl +eCkuDQonICAgICBWYWx1ZUlmTnVsbCAtIFJldHVybiB2YWx1ZSBpZiByZWNvcmQg +aXMgbWlzc2luZyBvciBkYXRhIGZpZWxkIHZhbHVlIGlzIE51bGwgKGRlZmF1bHQ6 +IE51bGwpLg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgVmFyaWFudCAgLSBOdWxsLCBp +ZiBTUUwgc3RhdGVtZW50IGRvZXMgbm90IHJldHVybiBhIHJlY29yZC4NCicNCicg +UmVtYXJrczoNCicgICAgIFRoZSBTUUwgc3RhdGVtZW50IG11c3QgYmUgd3JpdHRl +biBpbiB0aGUgSmV0L0FDRSBTUUwgZGlhbGVjdC4NCicNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBMb29r +dXBTcWwoQnlWYWwgU3FsVGV4dCBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAg +ICAgT3B0aW9uYWwgQnlWYWwgSW5kZXggQXMgVmFyaWFudCA9IDAmLCBfDQogICAg +ICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIFZhbHVlSWZOdWxsIEFzIFZhcmlh +bnQgPSBOdWxsKSBBcyBWYXJpYW50DQoNCiAgIERpbSByc3QgQXMgREFPLlJlY29y +ZHNldA0KDQpPbiBFcnJvciBHb1RvIEhhbmRsZUVycg0KDQogICBTZXQgcnN0ID0g +TWUuT3BlblJlY29yZHNldChTcWxUZXh0LCBkYk9wZW5Gb3J3YXJkT25seSwgZGJT +ZWVDaGFuZ2VzLCBkYlJlYWRPbmx5KQ0KICAgV2l0aCByc3QNCiAgICAgIElmIC5F +T0YgVGhlbg0KICAgICAgICAgTG9va3VwU3FsID0gVmFsdWVJZk51bGwNCiAgICAg +IEVsc2UNCiAgICAgICAgIExvb2t1cFNxbCA9IE56KC5GaWVsZHMoSW5kZXgpLCBW +YWx1ZUlmTnVsbCkNCiAgICAgIEVuZCBJZg0KICAgICAgLkNsb3NlDQogICBFbmQg +V2l0aA0KICAgU2V0IHJzdCA9IE5vdGhpbmcNCiAgIA0KRXhpdEhlcmU6DQogICBF +eGl0IEZ1bmN0aW9uDQogICANCkhhbmRsZUVycjoNCiAgIElmIE5vdCAocnN0IElz +IE5vdGhpbmcpIFRoZW4NCiAgICAgIHJzdC5DbG9zZQ0KICAgICAgU2V0IHJzdCA9 +IE5vdGhpbmcNCiAgIEVuZCBJZg0KICAgDQogICBFcnIuUmFpc2UgRXJyLk51bWJl +ciwgIkxvb2t1cFNRTDoiICYgRXJyLlNvdXJjZSwgRXJyLkRlc2NyaXB0aW9uLCBF +cnIuSGVscEZpbGUsIEVyci5IZWxwQ29udGV4dA0KDQpFbmQgRnVuY3Rpb24NCg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5j +dGlvbjogTG9va3VwDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonDQonIERBTy5SZWNvcmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24g +Zm9yIERMb29rdXANCicNCicgUGFyYW1ldGVyczoNCicgICAgIEV4cHIgICAgICAg +IC0gRmllbGQgbmFtZSBvciBjYWxjdWxhdGVkIGV4cHJlc3Npb24gKHNlbGVjdCBw +YXJ0KQ0KJyAgICAgRG9tYWluICAgICAgLSBUYWJsZSwgcXVlcnkgb3IgU1FMIGV4 +cHJlc3Npb24gZm9yIHN1Yi1xdWVyeSAoRlJPTSBwYXJ0KQ0KJyAgICAgQ3JpdGVy +aWEgICAgLSAoT3B0aW9uYWwpIENyaXRlcmlhIHN0cmluZyAoV0hFUkUgcGFydCkN +CicgICAgIFZhbHVlSWZOdWxsIC0gUmV0dXJuIHZhbHVlIGlmIHJlY29yZCBpcyBt +aXNzaW5nIG9yIGRhdGEgZmllbGQgdmFsdWUgaXMgTnVsbCAoZGVmYXVsdDogTnVs +bCkuDQonDQonIFJldHVybnM6DQonICAgICBWYXJpYW50DQonDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24g +TG9va3VwKEJ5VmFsIEV4cHIgQXMgU3RyaW5nLCBCeVZhbCBEb21haW4gQXMgU3Ry +aW5nLCBfDQogICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFz +IFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgVmFsdWVJ +Zk51bGwgQXMgVmFyaWFudCA9IE51bGwpIEFzIFZhcmlhbnQNCg0KICAgRGltIFNl +bGVjdFNxbCBBcyBTdHJpbmcNCg0KICAgU2VsZWN0U3FsID0gQnVpbGRTZWxlY3RT +cWwoRXhwciwgRG9tYWluLCBDcml0ZXJpYSwgRmFsc2UpDQogICBMb29rdXAgPSBM +b29rdXBTcWwoU2VsZWN0U3FsLCAsIFZhbHVlSWZOdWxsKQ0KDQpFbmQgRnVuY3Rp +b24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBCdWlsZFNlbGVjdFNxbChCeVZhbCBFeHBy +IEFzIFN0cmluZywgQnlWYWwgRG9tYWluIEFzIFN0cmluZywgT3B0aW9uYWwgQnlW +YWwgQ3JpdGVyaWEgQXMgVmFyaWFudCwgXw0KICAgICAgICAgICAgICAgICAgICAg +ICBPcHRpb25hbCBCeVZhbCBEaXN0aW5jdCBBcyBCb29sZWFuID0gRmFsc2UpDQoN +CiAgIERpbSBTZWxlY3RTcWwgQXMgU3RyaW5nDQoNCiAgIFNlbGVjdFNxbCA9ICJT +RUxFQ1QgIg0KICAgSWYgRGlzdGluY3QgVGhlbg0KICAgICAgU2VsZWN0U3FsID0g +U2VsZWN0U3FsICYgIkRpc3RpbmN0ICINCiAgIEVuZCBJZg0KICAgU2VsZWN0U3Fs +ID0gU2VsZWN0U3FsICYgRXhwciAmICIgRlJPTSAoIiAmIERvbWFpbiAmICIpIg0K +ICAgSWYgTm90IChWYXJUeXBlKENyaXRlcmlhKSA9IHZiRXJyb3IpIFRoZW4NCiAg +ICAgIElmIExlbihDcml0ZXJpYSkgPiAwIFRoZW4NCiAgICAgICAgIFNlbGVjdFNx +bCA9IFNlbGVjdFNxbCAmICIgV0hFUkUgIiAmIENyaXRlcmlhDQogICAgICBFbmQg +SWYNCiAgIEVuZCBJZg0KICAgDQogICBCdWlsZFNlbGVjdFNxbCA9IFNlbGVjdFNx +bA0KDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogQ291bnQNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgREFPLlJlY29yZHNldCBy +ZXBsYWNlbWVudCBmdW5jdGlvbiBmb3IgRENvdW50DQonDQonIFBhcmFtZXRlcnM6 +DQonICAgICBFeHByICAgICAgICAtIEZpZWxkIG5hbWUgb3IgY2FsY3VsYXRlZCBl +eHByZXNzaW9uIChzZWxlY3QgcGFydCkNCicgICAgIERvbWFpbiAgICAgIC0gVGFi +bGUsIHF1ZXJ5IG9yIFNRTCBleHByZXNzaW9uIGZvciBzdWItcXVlcnkgKEZST00g +cGFydCkNCicgICAgIENyaXRlcmlhICAgIC0gKG9wdGlvbmFsKSBDcml0ZXJpYSBz +dHJpbmcgKFdIRVJFIHBhcnQpDQonDQonIFJldHVybnM6DQonICAgICBMb25nDQon +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJs +aWMgRnVuY3Rpb24gQ291bnQoQnlWYWwgRXhwciBBcyBTdHJpbmcsIEJ5VmFsIERv +bWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFzIFZhcmlh +bnQsIF8NCiAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBEaXN0aW5jdCBBcyBC +b29sZWFuID0gRmFsc2UpIEFzIExvbmcNCiAgICAgICAgICAgICANCiAgIElmIERp +c3RpbmN0IFRoZW4NCiAgICAgIElmIEV4cHIgPD4gIioiIFRoZW4NCiAgICAgICAg +IERvbWFpbiA9ICIoIiAmIEJ1aWxkU2VsZWN0U3FsKEV4cHIsIERvbWFpbiwgQ3Jp +dGVyaWEsIFRydWUpICYgIikiDQogICAgICAgICBDcml0ZXJpYSA9IHZiTnVsbFN0 +cmluZw0KICAgICAgRW5kIElmDQogICBFbmQgSWYNCiAgICAgICAgICAgICANCiAg +IENvdW50ID0gTnooTWUuTG9va3VwKCJDb3VudCgiICYgRXhwciAmICIpIiwgRG9t +YWluLCBDcml0ZXJpYSksIDApDQogICANCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBN +YXgNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicN +CicgREFPLlJlY29yZHNldCByZXBsYWNlbWVudCBmdW5jdGlvbiBmb3IgRE1heA0K +Jw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgRXhwciAgICAgICAgLSBGaWVsZCBuYW1l +IG9yIGNhbGN1bGF0ZWQgZXhwcmVzc2lvbiAoc2VsZWN0IHBhcnQpDQonICAgICBE +b21haW4gICAgICAtIFRhYmxlLCBxdWVyeSBvciBTUUwgZXhwcmVzc2lvbiBmb3Ig +c3ViLXF1ZXJ5IChGUk9NIHBhcnQpDQonICAgICBDcml0ZXJpYSAgICAtIChPcHRp +b25hbCkgQ3JpdGVyaWEgc3RyaW5nIChXSEVSRSBwYXJ0KQ0KJw0KJyBSZXR1cm5z +Og0KJyAgICAgVmFyaWFudA0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIE1heChCeVZhbCBFeHByIEFz +IFN0cmluZywgQnlWYWwgRG9tYWluIEFzIFN0cmluZywgT3B0aW9uYWwgQnlWYWwg +Q3JpdGVyaWEgQXMgVmFyaWFudCkgQXMgVmFyaWFudA0KICAgIE1heCA9IE1lLkxv +b2t1cCgiTWF4KCIgJiBFeHByICYgIikiLCBEb21haW4sIENyaXRlcmlhKQ0KRW5k +IEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NCicgRnVuY3Rpb246IE1pbg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBEQU8uUmVjb3Jkc2V0IHJlcGxhY2VtZW50 +IGZ1bmN0aW9uIGZvciBETWluDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBFeHBy +ICAgICAgICAtIEZpZWxkIG5hbWUgb3IgY2FsY3VsYXRlZCBleHByZXNzaW9uIChz +ZWxlY3QgcGFydCkNCicgICAgIERvbWFpbiAgICAgIC0gVGFibGUsIHF1ZXJ5IG9y +IFNRTCBleHByZXNzaW9uIGZvciBzdWItcXVlcnkgKEZST00gcGFydCkNCicgICAg +IENyaXRlcmlhICAgIC0gKE9wdGlvbmFsKSBDcml0ZXJpYSBzdHJpbmcgKFdIRVJF +IHBhcnQpDQonDQonIFJldHVybnM6DQonICAgICBWYXJpYW50DQonDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rp +b24gTWluKEJ5VmFsIEV4cHIgQXMgU3RyaW5nLCBCeVZhbCBEb21haW4gQXMgU3Ry +aW5nLCBPcHRpb25hbCBCeVZhbCBDcml0ZXJpYSBBcyBWYXJpYW50KSBBcyBWYXJp +YW50DQogICAgTWluID0gTWUuTG9va3VwKCJNaW4oIiAmIEV4cHIgJiAiKSIsIERv +bWFpbiwgQ3JpdGVyaWEpDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogU3VtDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIERBTy5S +ZWNvcmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIERTdW0NCicNCicgUGFy +YW1ldGVyczoNCicgICAgIEV4cHIgICAgICAgIC0gRmllbGQgbmFtZSBvciBjYWxj +dWxhdGVkIGV4cHJlc3Npb24gKHNlbGVjdCBwYXJ0KQ0KJyAgICAgRG9tYWluICAg +ICAgLSBUYWJsZSwgcXVlcnkgb3IgU1FMIGV4cHJlc3Npb24gZm9yIHN1Yi1xdWVy +eSAoRlJPTSBwYXJ0KQ0KJyAgICAgQ3JpdGVyaWEgICAgLSAoT3B0aW9uYWwpIENy +aXRlcmlhIHN0cmluZyAoV0hFUkUgcGFydCkNCicNCicgUmV0dXJuczoNCicgICAg +IFZhcmlhbnQNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NClB1YmxpYyBGdW5jdGlvbiBTdW0oQnlWYWwgRXhwciBBcyBTdHJpbmcs +IEJ5VmFsIERvbWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlh +IEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQNCiAgICBTdW0gPSBNZS5Mb29rdXAoIlN1 +bSgiICYgRXhwciAmICIpIiwgRG9tYWluLCBDcml0ZXJpYSkNCkVuZCBGdW5jdGlv +bg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQon +IEZ1bmN0aW9uOiBFeGlzdHMNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicNCicgQ2hlY2sgaWYgcmVjb3JkIGV4aXN0cw0KJw0KJyBQ +YXJhbWV0ZXJzOg0KJyAgICAgRG9tYWluICAgLSBkYXRhIHNvdXJjZSAoRlJPTSBw +YXJ0KQ0KJyAgICAgQ3JpdGVyaWEgLSAoT3B0aW9uYWwpIENyaXRlcmlhIHN0cmlu +ZyAoV0hFUkUgcGFydCkNCicNCicgUmV0dXJuczoNCicgICAgIEJvb2xlYW4NCicN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1Ymxp +YyBGdW5jdGlvbiBFeGlzdHMoQnlWYWwgRG9tYWluIEFzIFN0cmluZywgXw0KICAg +ICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBDcml0ZXJpYSBBcyBTdHJpbmcgPSB2 +Yk51bGxTdHJpbmcpIEFzIEJvb2xlYW4NCg0KICAgRGltIHN0clNRTCBBcyBTdHJp +bmcNCg0KICAgc3RyU1FMID0gIlNFTEVDVCBUcnVlIEZST00gIiAmIERvbWFpbg0K +ICAgSWYgTGVuKENyaXRlcmlhKSA+IDAgVGhlbg0KICAgICAgc3RyU1FMID0gc3Ry +U1FMICYgIiBXSEVSRSAiICYgQ3JpdGVyaWENCiAgIEVuZCBJZg0KICAgRXhpc3Rz +ID0gKExvb2t1cFNxbChzdHJTUUwsICwgRmFsc2UpID0gVHJ1ZSkNCg0KRW5kIEZ1 +bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NCicgRnVuY3Rpb246IEluc2VydElkZW50aXR5UmV0dXJuDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEV4ZWN1dGUgaW5z +ZXJ0IFNRTCBzdGF0ZW1lbnQgYW5kIHJldHVybiBsYXN0IGlkZW50aXR5IHZhbHVl +IChhdXRvIHZhbHVlKQ0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgSW5zZXJ0U1FM +ICAgLSBJbnNlcnQgU1FMIHN0YXRlbWVudA0KJw0KJyBSZXR1cm5zOg0KJyAgICAg +SWRlbnRpdHkgdmFsdWUgb3IgTlVMTCBpZiBubyByZWNvcmQgd2FzIGFwcGVuZGVk +DQonDQonIFJlbWFya3M6DQonICAgICBXb3JrcyBmb3IgSmV0IG9ubHkgZnJvbSBK +ZXQgNC4wIChBY2Nlc3MgMjAwMCksIElkZW50aXR5VGFibGUgaXMgb25seSBhcHBs +aWNhYmxlIGZvciBNU1NRTCwgdW5kZXIgTXlTUUwgdGhlIElERU5UX0NVUlJFTlQg +ZnVuY3Rpb24gZG9lcyBub3QgZXhpc3QuDQonICAgICAoPGRhdGEuYWRvZGIuQWRv +ZGJIYW5kbGVyOjpJbnNlcnRJZGVudGl0eVJldHVybj4gaXMgbW9yZSBzdWl0YWJs +ZSByZWdhcmRpbmcgdXNlIGZvciBhY3RpdmUgREJNUy4pDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gSW5z +ZXJ0SWRlbnRpdHlSZXR1cm4oQnlWYWwgSW5zZXJ0U1FMIEFzIFN0cmluZykgQXMg +VmFyaWFudA0KDQogICAgRGltIGRiIEFzIERBTy5EYXRhYmFzZQ0KICAgIERpbSBy +c3QgQXMgREFPLlJlY29yZHNldA0KICAgIERpbSBSZWNvcmRzQWZmZWN0ZWQgQXMg +TG9uZw0KDQpPbiBFcnJvciBHb1RvIEhhbmRsZUVycg0KDQogICAgU2V0IGRiID0g +TWUuQ3VycmVudERiDQogICAgZGIuRXhlY3V0ZSBJbnNlcnRTUUwNCiAgICBSZWNv +cmRzQWZmZWN0ZWQgPSBkYi5SZWNvcmRzQWZmZWN0ZWQNCiAgICANCiAgICBJZiBS +ZWNvcmRzQWZmZWN0ZWQgPSAwIFRoZW4NCiAgICAgICAgSW5zZXJ0SWRlbnRpdHlS +ZXR1cm4gPSBOdWxsICdlcyB3dXJkZSBrZWluIG5ldWVyIERTIGFuZ2Vm/Gd0DQog +ICAgICAgIEV4aXQgRnVuY3Rpb24NCiAgICBFbmQgSWYNCg0KICAgIFNldCByc3Qg +PSBkYi5PcGVuUmVjb3Jkc2V0KCJTRUxFQ1QgQEBJZGVudGl0eSIpICd6dWxldHp0 +IHp1Z2V3aWVzZW5lciBBdXRvd2VydCAuLi4gZnVua3Rpb25pZXJ0IG5pY2h0IG1p +dCBNeVNRTC1UYWJlbGxlbiENCiAgICBXaXRoIHJzdA0KICAgICAgICBJZiAuRU9G +IFRoZW4NCiAgICAgICAgICAgIEluc2VydElkZW50aXR5UmV0dXJuID0gTnVsbA0K +ICAgICAgICBFbHNlDQogICAgICAgICAgICBJbnNlcnRJZGVudGl0eVJldHVybiA9 +IC5GaWVsZHMoMCkNCiAgICAgICAgRW5kIElmDQogICAgICAgIC5DbG9zZQ0KICAg +IEVuZCBXaXRoDQogICAgU2V0IHJzdCA9IE5vdGhpbmcNCiAgICANCkV4aXRIZXJl +Og0KICAgRXhpdCBGdW5jdGlvbg0KDQpIYW5kbGVFcnI6DQogICBJZiBOb3QgKHJz +dCBJcyBOb3RoaW5nKSBUaGVuDQogICAgICByc3QuQ2xvc2UNCiAgICAgIFNldCBy +c3QgPSBOb3RoaW5nDQogICBFbmQgSWYNCg0KICAgRXJyLlJhaXNlIEVyci5OdW1i +ZXIsICJJbnNlcnRJZGVudGl0eVJldHVybjoiICYgRXJyLlNvdXJjZSwgRXJyLkRl +c2NyaXB0aW9uLCBFcnIuSGVscEZpbGUsIEVyci5IZWxwQ29udGV4dA0KDQpFbmQg +RnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KJyBGdW5jdGlvbjogSW5zZXJ0VmFsdWVzDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIE9wZW4gcmVjb3Jkc2V0IGFu +ZCBhcHBlbmQgdmFsdWVzDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBTb3VyY2Ug +ICAgICAgICAgICAtIEluc2VydCBkYXRhIHNvdXJjZQ0KJyAgICAgRmllbGRzQW5k +VmFsdWVzICAgLSBQYXJhbUFycmF5OiAiRmllbGQxIiwgVmFsdWUxLCAiRmllbGQy +IiwgVmFsdWUyLCAuLi4uDQonDQonIFJldHVybnM6DQonICAgICBUcnVlIGlmIGZ1 +bGx5IGV4ZWN1dGVkDQonDQonIFJlbWFya3M6DQonICAgICBTaW5jZSBhIHJlY29y +ZHNldCBpcyB1c2VkIGZvciBpbnNlcnRpb24sIHRoZXJlIGlzIG5vIGRhdGEgdHlw +ZSBjaGVjayBpbiB0aGUgY29kZSAtPiB3YXRjaCBvdXQgZm9yIGltcGxpY2l0IGNv +bnZlcnNpb24uDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gSW5zZXJ0VmFsdWVzKEJ5VmFsIFNvdXJj +ZSBBcyBTdHJpbmcsIFBhcmFtQXJyYXkgRmllbGRzQW5kVmFsdWVzKCkgQXMgVmFy +aWFudCkgQXMgQm9vbGVhbg0KICAgSW5zZXJ0VmFsdWVzID0gSW5zZXJ0UmVjb3Jk +VmFsdWVzQXJyYXlSZXR1cm5GaWVsZFZhbHVlKFNvdXJjZSwgdmJOdWxsU3RyaW5n +LCBGaWVsZHNBbmRWYWx1ZXMpDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogSW5zZXJ0 +VmFsdWVzUmV0dXJuRmllbGRWYWx1ZQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBSb3BlbiBlY29yZHNldCBhbmQgYXBwZW5k +IHZhbHVlcywgcmV0dXJucyB2YWx1ZSBvZiBhIGRlZmluZWQgZGF0YSBmaWVsZA0K +Jw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgU291cmNlICAgICAgICAgICAgICAgICAg +LSBJbnNlcnQgZGF0YSBzb3VyY2UNCicgICAgIFJldHVybkZpZWxkTmFtZU9ySW5k +ZXggIC0gRGF0ZW5mZWxkIGb8ciBXZXJ0cvxja2dhYmU8L3BhcmFtPg0KJyAgICAg +RmllbGRzQW5kVmFsdWVzICAgICAgICAgLSBQYXJhbUFycmF5OiAiRmllbGQxIiwg +VmFsdWUxLCAiRmllbGQyIiwgVmFsdWUyLCAuLi4uDQonDQonIFJldHVybnM6DQon +ICAgICBWYWx1ZSBmcm9tIGRhdGEgZmllbGQNCicNCicgUmVtYXJrczoNCicgICAg +IFNpbmNlIGEgcmVjb3Jkc2V0IGlzIHVzZWQgZm9yIGluc2VydGlvbiwgdGhlcmUg +aXMgbm8gZGF0YSB0eXBlIGNoZWNrIGluIHRoZSBjb2RlIC0+IHdhdGNoIG91dCBm +b3IgaW1wbGljaXQgY29udmVyc2lvbi4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBJbnNlcnRWYWx1 +ZXNSZXR1cm5GaWVsZFZhbHVlKEJ5VmFsIFNvdXJjZSBBcyBTdHJpbmcsIEJ5VmFs +IFJldHVybkZpZWxkTmFtZU9ySW5kZXggQXMgVmFyaWFudCwgUGFyYW1BcnJheSBG +aWVsZHNBbmRWYWx1ZXMoKSBBcyBWYXJpYW50KSBBcyBWYXJpYW50DQogICBJbnNl +cnRWYWx1ZXNSZXR1cm5GaWVsZFZhbHVlID0gSW5zZXJ0UmVjb3JkVmFsdWVzQXJy +YXlSZXR1cm5GaWVsZFZhbHVlKFNvdXJjZSwgUmV0dXJuRmllbGROYW1lT3JJbmRl +eCwgRmllbGRzQW5kVmFsdWVzKQ0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVu +Y3Rpb24gSW5zZXJ0UmVjb3JkVmFsdWVzQXJyYXlSZXR1cm5GaWVsZFZhbHVlKCBf +DQogICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBTb3VyY2UgQXMgU3RyaW5n +LCBCeVZhbCBSZXR1cm5GaWVsZCBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAg +ICAgICAgICAgICBCeVZhbCBGaWVsZHNBbmRWYWx1ZXMgQXMgVmFyaWFudCkgQXMg +VmFyaWFudA0KDQogICAgRGltIGxuZ051bSBBcyBMb25nLCBsbmdBbnogQXMgTG9u +ZywgaSBBcyBMb25nLCBhbnogQXMgTG9uZw0KICAgIERpbSBGaWVsZE5hbWVzKCkg +QXMgVmFyaWFudCwgRmllbGRWYWx1ZXMoKSBBcyBWYXJpYW50DQogICAgRGltIHJz +dCBBcyBEQU8uUmVjb3Jkc2V0DQogICAgRGltIEVyck5vIEFzIExvbmcsIEVyckRl +c2MgQXMgU3RyaW5nLCBFcnJTb3VyY2UgQXMgU3RyaW5nDQogDQpPbiBFcnJvciBH +b1RvIEhhbmRsZUVycg0KDQogICAgbG5nTnVtID0gVUJvdW5kKEZpZWxkc0FuZFZh +bHVlcykgLSBMQm91bmQoRmllbGRzQW5kVmFsdWVzKSArIDEgJ2hmQXJyYXlTaXpl +KEZpZWxkc0FuZFZhbHVlcykNCiAgICBSZURpbSBGaWVsZE5hbWVzKGxuZ051bSBc +IDIpDQogICAgUmVEaW0gRmllbGRWYWx1ZXMobG5nTnVtIFwgMikNCiAgICANCiAg +ICBhbnogPSAwDQogICAgRm9yIGkgPSAwIFRvIChsbmdOdW0gLSAyKSBTdGVwIDIN +CiAgICAgIEZpZWxkTmFtZXMoYW56KSA9IEZpZWxkc0FuZFZhbHVlcyhpKQ0KICAg +ICAgRmllbGRWYWx1ZXMoYW56KSA9IEZpZWxkc0FuZFZhbHVlcyhpICsgMSkNCiAg +ICAgIGFueiA9IGFueiArIDENCiAgICBOZXh0IGkNCg0KICAgIFNldCByc3QgPSBN +ZS5PcGVuUmVjb3Jkc2V0KFNvdXJjZSwgZGJPcGVuRHluYXNldCkNCiAgICBXaXRo +IHJzdA0KICAgIA0KICAgICAgLkFkZE5ldw0KICAgICAgaSA9IDANCiAgICAgIEZv +ciBpID0gMCBUbyAoYW56IC0gMSkNCiAgICAgICAgIC5GaWVsZHMoRmllbGROYW1l +cyhpKSkgPSBGaWVsZFZhbHVlcyhpKQ0KICAgICAgTmV4dCBpDQogICAgICAuVXBk +YXRlDQogICAgICANCiAgICAgIElmIExlbihSZXR1cm5GaWVsZCAmIHZiTnVsbFN0 +cmluZykgPiAwIFRoZW4NCiAgICAgICAgICAuQm9va21hcmsgPSAuTGFzdE1vZGlm +aWVkDQogICAgICAgICAgSW5zZXJ0UmVjb3JkVmFsdWVzQXJyYXlSZXR1cm5GaWVs +ZFZhbHVlID0gLkZpZWxkcyhSZXR1cm5GaWVsZCkNCiAgICAgIEVsc2UNCiAgICAg +ICAgICBJbnNlcnRSZWNvcmRWYWx1ZXNBcnJheVJldHVybkZpZWxkVmFsdWUgPSBU +cnVlDQogICAgICBFbmQgSWYNCiAgICAgIA0KICAgICAgLkNsb3NlDQogICAgICAN +CiAgICBFbmQgV2l0aA0KICAgIFNldCByc3QgPSBOb3RoaW5nDQoNCkV4aXRIZXJl +Og0KICAgIEV4aXQgRnVuY3Rpb24NCiAgICANClJlc3VtZVJhaXNlRXJyb3I6DQpP +biBFcnJvciBHb1RvIDANCiAgIEVyci5SYWlzZSBFcnJObywgRXJyU291cmNlLCBF +cnJEZXNjDQoNCkhhbmRsZUVycjoNCiAgICBFcnJObyA9IEVyci5OdW1iZXINCiAg +ICBFcnJEZXNjID0gRXJyLkRlc2NyaXB0aW9uDQogICAgRXJyU291cmNlID0gIklu +c2VydFJlY29yZFZhbHVlc0FycmF5UmV0dXJuRmllbGRWYWx1ZSAoIiAmIEVyci5T +b3VyY2UgJiAiKSINCg0KICAgIElmIE5vdCAocnN0IElzIE5vdGhpbmcpIFRoZW4N +CiAgICAgICAgcnN0LkNsb3NlDQogICAgRW5kIElmDQogICAgU2V0IHJzdCA9IE5v +dGhpbmcNCiAgICBSZXN1bWUgUmVzdW1lUmFpc2VFcnJvcg0KDQpFbmQgRnVuY3Rp +b24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +JyBGdW5jdGlvbjogTmV3UmVjb3JkDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonDQonIEFwcGVuZCByZWNvcmQgdmlhIHJlY29yZHNl +dCBhbmQgc2V0IGZpZWxkIHZhbHVlcy4NCicNCicgUGFyYW1ldGVyczoNCicgICAg +IFNvdXJjZSAgICAgICAgICAgICAgICAgIC0gRGF0YSBzb3VyY2UgKHRhYmxlIG5h +bWUgb3IgU1FMIHN0YXRlbWVudCkNCicgICAgIFJldHVybkZpZWxkTmFtZSAgICAg +ICAgIC0gRmllbGQgbmFtZSB3aG9zZSB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCAo +ZS5nLiBhdXRvbnVtYmVyIGZpZWxkKS4NCicgICAgIEZpZWxkc0FuZFZhbHVlcyAg +ICAgICAgIC0gbmV3IGRhdGEgLi4uIFBhcmFtQXJyYXk6ICJGaWVsZDEiLCBWYWx1 +ZTEsICJGaWVsZDIiLCBWYWx1ZTIsIC4uLi4NCicNCicgUmV0dXJuczoNCicgICAg +IFZhbHVlIGZyb20gUmV0dXJuRmllbGROYW1lLCBvciBUcnVlL0ZhbHNlIGlmIG5v +IFJldHVybkZpZWxkTmFtZSB3YXMgc3BlY2lmaWVkLg0KJw0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIE5l +d1JlY29yZChCeVZhbCBTb3VyY2UgQXMgU3RyaW5nLCBCeVZhbCBSZXR1cm5GaWVs +ZE5hbWUgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAgIFBhcmFtQXJyYXkg +RmllbGRzQW5kVmFsdWVzKCkgQXMgVmFyaWFudCkgQXMgVmFyaWFudA0KDQogICBE +aW0gdkEoKSBBcyBWYXJpYW50DQogICB2QSA9IENvbnZlcnRQYXJhbUFycmF5VG9W +YXJpYW50QXJyYXkoRmllbGRzQW5kVmFsdWVzKQ0KICAgTmV3UmVjb3JkID0gTmV3 +UmVjb3JkX0ZpZWxkQXJyYXkoU291cmNlLCBSZXR1cm5GaWVsZE5hbWUsIHZBKQ0K +DQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBDb252ZXJ0UGFyYW1B +cnJheVRvVmFyaWFudEFycmF5KEJ5VmFsIEFycmF5VG9Db252ZXJ0IEFzIFZhcmlh +bnQpIEFzIFZhcmlhbnQoKQ0KICAgQ29udmVydFBhcmFtQXJyYXlUb1ZhcmlhbnRB +cnJheSA9IEFycmF5VG9Db252ZXJ0DQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBG +dW5jdGlvbiBOZXdSZWNvcmRfRmllbGRBcnJheShCeVZhbCBzdHJTb3VyY2UgQXMg +U3RyaW5nLCBCeVZhbCBSZXR1cm5GaWVsZE5hbWUgQXMgU3RyaW5nLCBfDQogICAg +ICAgICAgICAgICAgICAgICAgIEJ5UmVmIERhdGFQYXJhbXMoKSBBcyBWYXJpYW50 +KSBBcyBWYXJpYW50DQoNCiAgICBEaW0gbG5nTnVtIEFzIExvbmcsIGkgQXMgTG9u +ZywgYW56IEFzIExvbmcNCiAgICBEaW0gRGF0YUZpZWxkcygpIEFzIFZhcmlhbnQs +IERhdGFWYWx1ZXMoKSBBcyBWYXJpYW50DQogICAgRGltIHJzdCBBcyBEQU8uUmVj +b3Jkc2V0DQoNCiAgICBsbmdOdW0gPSBVQm91bmQoRGF0YVBhcmFtcykgKyAxDQog +ICAgUmVEaW0gRGF0YUZpZWxkcyhsbmdOdW0gXCAyKQ0KICAgIFJlRGltIERhdGFW +YWx1ZXMobG5nTnVtIFwgMikNCiAgICANCiAgICBhbnogPSAwDQogICAgRm9yIGkg +PSAwIFRvIChsbmdOdW0gLSAyKSBTdGVwIDINCiAgICAgIERhdGFGaWVsZHMoYW56 +KSA9IERhdGFQYXJhbXMoaSkNCiAgICAgIERhdGFWYWx1ZXMoYW56KSA9IERhdGFQ +YXJhbXMoaSArIDEpDQogICAgICBhbnogPSBhbnogKyAxDQogICAgTmV4dCBpDQog +ICAgDQogICAgU2V0IHJzdCA9IE1lLk9wZW5SZWNvcmRzZXQoc3RyU291cmNlLCBk +Yk9wZW5EeW5hc2V0KQ0KDQpPbiBFcnJvciBHb1RvIEhhbmRsZUVycg0KICAgIFdp +dGggcnN0DQogICAgICAuQWRkTmV3DQogICAgICBpID0gMA0KICAgICAgRm9yIGkg +PSAwIFRvIChhbnogLSAxKQ0KICAgICAgICAgLkZpZWxkcyhEYXRhRmllbGRzKGkp +KSA9IERhdGFWYWx1ZXMoaSkNCiAgICAgIE5leHQgaQ0KDQogICAgICAuVXBkYXRl +DQogICAgICBJZiBMZW4oUmV0dXJuRmllbGROYW1lKSA+IDAgVGhlbg0KICAgICAg +ICAgIC5Cb29rbWFyayA9IC5MYXN0TW9kaWZpZWQNCiAgICAgICAgICBOZXdSZWNv +cmRfRmllbGRBcnJheSA9IC5GaWVsZHMoUmV0dXJuRmllbGROYW1lKS5WYWx1ZQ0K +ICAgICAgRWxzZQ0KICAgICAgICAgIE5ld1JlY29yZF9GaWVsZEFycmF5ID0gVHJ1 +ZQ0KICAgICAgRW5kIElmDQogICAgICAuQ2xvc2UNCiAgICBFbmQgV2l0aA0KICAg +IFNldCByc3QgPSBOb3RoaW5nDQoNCkV4aXRIZXJlOg0KICAgIEV4aXQgRnVuY3Rp +b24NCg0KSGFuZGxlRXJyOg0KICAgRGltIEZuY0Vyck5yIEFzIExvbmcNCiAgIERp +bSBGbmNFcnJEZXNjIEFzIFN0cmluZw0KDQogICBGbmNFcnJOciA9IEVyci5OdW1i +ZXINCiAgIEZuY0VyckRlc2MgPSBFcnIuRGVzY3JpcHRpb24NCiAgIEVyci5DbGVh +cg0KT24gRXJyb3IgUmVzdW1lIE5leHQNCiAgICBJZiBOb3QgKHJzdCBJcyBOb3Ro +aW5nKSBUaGVuDQogICAgICAgIHJzdC5DbG9zZQ0KICAgICAgICBTZXQgcnN0ID0g +Tm90aGluZw0KICAgIEVuZCBJZg0KT24gRXJyb3IgR29UbyAwDQogICBFcnIuUmFp +c2UgRm5jRXJyTnIsICJOZXdSZWNvcmRfRmllbGRBcnJheSIsIEZuY0VyckRlc2MN +Cg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IENvcHlSZWNvcmQNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQ29weSBkYXRhIHNl +dCBhbmQgY2hhbmdlIGluZGl2aWR1YWwgdmFsdWVzDQonDQonIFBhcmFtZXRlcnM6 +DQonICAgICBTb3VyY2UgICAgICAgICAgICAtIERhdGEgc291cmNlICh0YWJsZSBu +YW1lIG9yIFNRTCBzdGF0ZW1lbnQpDQonICAgICBTdGFydEZpZWxkTnVtYmVyICAt +IERhdGEgZmllbGQgbnVtYmVyICg9ZmllbGQgaW5kZXgrMSkgZnJvbSB3aGljaCB0 +aGUgZGF0YSBpcyBjb3BpZWQNCicgICAgIExhc3RGaWVsZE51bWJlciAgIC0gRGF0 +YSBmaWVsZCBudW1iZXIgKD1maWVsZCBpbmRleCsxKSB1cCB0byB3aGljaCB0aGUg +ZGF0YSBhcmUgY29waWVkLiBBIG5lZ2F0aXZlIHZhbHVlIGNvdW50cyBmcm9tIGJl +aGluZC4NCicgICAgIFJldHVybkZpZWxkTmFtZSAgIC0gRmllbGQgbmFtZSB3aG9z +ZSB2YWx1ZSBpcyB0byBiZSByZXR1cm5lZCAoZS5nLiBhdXRvIG51bWJlciBmaWVs +ZCkuDQonICAgICBEYXRhVG9DaGFuZ2UgICAgICAtIGRhdGEgdG8gYmUgY2hhbmdl +ZCAuLi4gYWx0ZXJuYXRpbmc6IGZpZWxkIG5hbWUsIGZpZWxkIHZhbHVlIC0gUGFy +YW1BcnJheTogIkZpZWxkMSIsIFZhbHVlMSwgIkZpZWxkMiIsIFZhbHVlMiwgLi4u +Lg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgVmFsdWUgZnJvbSBSZXR1cm5GaWVsZE5h +bWUsIG9yIFRydWUvRmFsc2UgaWYgbm8gUmV0dXJuRmllbGROYW1lIHdhcyBzcGVj +aWZpZWQuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQpQdWJsaWMgRnVuY3Rpb24gQ29weVJlY29yZChCeVZhbCBTb3VyY2UgQXMg +U3RyaW5nLCBfDQogICAgICAgICAgICAgICAgIEJ5VmFsIFN0YXJ0RmllbGROdW1i +ZXIgQXMgTG9uZywgQnlWYWwgTGFzdEZpZWxkTnVtYmVyIEFzIExvbmcsIF8NCiAg +ICAgICAgICAgICAgICAgQnlWYWwgUmV0dXJuRmllbGROYW1lIEFzIFN0cmluZywg +Xw0KICAgICAgICAgICAgICAgICBQYXJhbUFycmF5IERhdGFUb0NoYW5nZSgpIEFz +IFZhcmlhbnQpIEFzIFZhcmlhbnQNCg0KICAgIERpbSB2QSgpIEFzIFZhcmlhbnQN +CiAgICB2QSA9IENvbnZlcnRQYXJhbUFycmF5VG9WYXJpYW50QXJyYXkoRGF0YVRv +Q2hhbmdlKQ0KDQogICAgQ29weVJlY29yZCA9IENvcHlSZWNvcmRfRmllbGRBcnJh +eShTb3VyY2UsIFN0YXJ0RmllbGROdW1iZXIsIExhc3RGaWVsZE51bWJlciwgUmV0 +dXJuRmllbGROYW1lLCB2QSkNCg0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVu +Y3Rpb24gQ29weVJlY29yZF9GaWVsZEFycmF5KEJ5VmFsIFNvdXJjZSBBcyBTdHJp +bmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlWYWwgU3Rh +cnRGaWVsZE51bWJlciBBcyBMb25nLCBCeVZhbCBMYXN0RmllbGROdW1iZXIgQXMg +TG9uZywgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBS +ZXR1cm5GaWVsZE5hbWUgQXMgU3RyaW5nLCBCeVJlZiBEYXRhVG9DaGFuZ2UoKSBB +cyBWYXJpYW50KSBBcyBWYXJpYW50DQoNCk9uIEVycm9yIEdvVG8gSGFuZGxlRXJy +DQoNCiAgIERpbSBsbmdOdW0gQXMgTG9uZywgaSBBcyBMb25nLCBpRFMgQXMgTG9u +ZywgYW56IEFzIExvbmcNCiAgIERpbSBzdHJDdGwoKSBBcyBWYXJpYW50LCB2YWxD +dGwoKSBBcyBWYXJpYW50DQogICBEaW0gcnN0IEFzIERBTy5SZWNvcmRzZXQNCiAg +IERpbSBsbmdMYXN0Q29weUZpZWxkIEFzIExvbmcsIGRzQW56IEFzIExvbmcsIFN0 +YXJ0IEFzIExvbmcNCiAgIERpbSBmQ29weVZhbCgpIEFzIFZhcmlhbnQNCg0KICAg +bG5nTnVtID0gVUJvdW5kKERhdGFUb0NoYW5nZSkgKyAxDQogIA0KICAgYW56ID0g +MA0KICAgUmVEaW0gc3RyQ3RsKChsbmdOdW0gXCAyKSAtIDEpDQogICBSZURpbSB2 +YWxDdGwoKGxuZ051bSBcIDIpIC0gMSkNCiAgIA0KICAgRm9yIGkgPSAwIFRvIChs +bmdOdW0gLSAyKSBTdGVwIDINCiAgICAgc3RyQ3RsKGFueikgPSBEYXRhVG9DaGFu +Z2UoaSkNCiAgICAgdmFsQ3RsKGFueikgPSBEYXRhVG9DaGFuZ2UoaSArIDEpDQog +ICAgIGFueiA9IGFueiArIDENCiAgIE5leHQgaQ0KICANCiAgICdSZWNvcmRzZXRv +Ympla3Qg9mZmbmVuDQogICBTZXQgcnN0ID0gT3BlblJlY29yZHNldChTb3VyY2Us +IGRiT3BlbkR5bmFzZXQpDQogICANCiAgIElmIHJzdC5FT0YgQW5kIHJzdC5CT0Yg +VGhlbg0KICAgICAgICAgcnN0LkNsb3NlDQogICAgICAgICBTZXQgcnN0ID0gTm90 +aGluZw0KICAgICAgICAgQ29weVJlY29yZF9GaWVsZEFycmF5ID0gMA0KICAgICAg +ICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogIA0KICAgV2l0aCByc3QNCiAg +ICAgIC5Nb3ZlTGFzdA0KICAgICAgLk1vdmVGaXJzdA0KICAgICAgZHNBbnogPSAu +UmVjb3JkQ291bnQNCiAgICAgIA0KICAgICAgSWYgTGFzdEZpZWxkTnVtYmVyID0g +MCBUaGVuDQogICAgICAgICAgbG5nTGFzdENvcHlGaWVsZCA9IC5GaWVsZHMuQ291 +bnQNCiAgICAgIEVsc2VJZiBMYXN0RmllbGROdW1iZXIgPCAwIFRoZW4NCiAgICAg +ICAgICBsbmdMYXN0Q29weUZpZWxkID0gLkZpZWxkcy5Db3VudCArIExhc3RGaWVs +ZE51bWJlcg0KICAgICAgRWxzZQ0KICAgICAgICAgIGxuZ0xhc3RDb3B5RmllbGQg +PSBMYXN0RmllbGROdW1iZXINCiAgICAgIEVuZCBJZg0KICAgICAgDQogICAgICBS +ZURpbSBmQ29weVZhbChkc0FueiwgbG5nTGFzdENvcHlGaWVsZCkNCiAgICAgIA0K +ICAgICAgSWYgU3RhcnRGaWVsZE51bWJlciA+IDEgVGhlbiBTdGFydCA9IFN0YXJ0 +RmllbGROdW1iZXIgLSAxIEVsc2UgU3RhcnQgPSAwDQogICAgICANCiAgICAgICdX +ZXJ0ZSBlaW5sZXNlbg0KICAgICAgaURTID0gMA0KICAgICAgV2hpbGUgTm90IC5F +T0YNCiAgICAgICAgICBGb3IgaSA9IFN0YXJ0IFRvIGxuZ0xhc3RDb3B5RmllbGQg +LSAxDQogICAgICAgICAgICBmQ29weVZhbChpRFMsIGkpID0gLkZpZWxkcyhpKS5W +YWx1ZQ0KICAgICAgICAgIE5leHQgaQ0KICAgICAgICAgIC5Nb3ZlTmV4dA0KICAg +ICAgICAgIGlEUyA9IGlEUyArIDENCiAgICAgIFdlbmQNCiAgICAgIC5Nb3ZlTGFz +dA0KIA0KICAgICAgJ1dlcnRlIGtvcGllcmVuDQogICAgICBGb3IgaURTID0gMCBU +byAoZHNBbnogLSAxKQ0KICAgICAgICAgLkFkZE5ldw0KICAgICAgICAgRm9yIGkg +PSBTdGFydCBUbyAobG5nTGFzdENvcHlGaWVsZCAtIDEpDQogICAgICAgICAgIC5G +aWVsZHMoaSkgPSBmQ29weVZhbChpRFMsIGkpDQogICAgICAgICBOZXh0IGkNCiAg +ICAgICAgIEZvciBpID0gMCBUbyAoYW56IC0gMSkNCiAgICAgICAgICAgLkZpZWxk +cyhzdHJDdGwoaSkpID0gdmFsQ3RsKGkpDQogICAgICAgICBOZXh0IGkNCiAgICAg +ICAgIC5VcGRhdGUNCiAgICAgIE5leHQgaURTDQogICAgICAgDQogICAgICBJZiBM +ZW4oUmV0dXJuRmllbGROYW1lKSA+IDAgVGhlbg0KICAgICAgICAgIC5Cb29rbWFy +ayA9IC5MYXN0TW9kaWZpZWQNCiAgICAgICAgICBDb3B5UmVjb3JkX0ZpZWxkQXJy +YXkgPSAuRmllbGRzKFJldHVybkZpZWxkTmFtZSkuVmFsdWUNCiAgICAgIEVsc2UN +CiAgICAgICAgICBDb3B5UmVjb3JkX0ZpZWxkQXJyYXkgPSBUcnVlDQogICAgICBF +bmQgSWYNCiAgICAgIA0KICAgICAgLkNsb3NlDQogICAgICANCiAgRW5kIFdpdGgN +CiAgDQpFeGl0SGVyZToNCiAgICBFeGl0IEZ1bmN0aW9uDQoNCkhhbmRsZUVycjoN +CiAgIERpbSBGbmNFcnJOciBBcyBMb25nDQogICBEaW0gRm5jRXJyRGVzYyBBcyBT +dHJpbmcNCg0KICAgRm5jRXJyTnIgPSBFcnIuTnVtYmVyDQogICBGbmNFcnJEZXNj +ID0gRXJyLkRlc2NyaXB0aW9uDQogICBFcnIuQ2xlYXINCk9uIEVycm9yIFJlc3Vt +ZSBOZXh0DQogICAgSWYgTm90IChyc3QgSXMgTm90aGluZykgVGhlbg0KICAgICAg +ICByc3QuQ2xvc2UNCiAgICAgICAgU2V0IHJzdCA9IE5vdGhpbmcNCiAgICBFbmQg +SWYNCk9uIEVycm9yIEdvVG8gMA0KICAgRXJyLlJhaXNlIEZuY0Vyck5yLCAiRGFv +SGFuZGxlci5Db3B5UmVjb3JkX0ZpZWxkQXJyYXkiLCBGbmNFcnJEZXNjDQogICAN +CkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBDb3B5UmVjb3Jkcw0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBSZWNvcmRzZXQg9mZm +bmVuIHVuZCBXZXJ0ZSBlaW5lcyBEYXRlbnNhdHplcyBhbmb8Z2VuDQonDQonIFBh +cmFtZXRlcnM6DQonICAgICBTb3VyY2UgICAgICAgICAgICAtIERhdGEgc291cmNl +ICh0YWJsZSBuYW1lIG9yIFNRTCBzdGF0ZW1lbnQpDQonICAgICBTdGFydEZpZWxk +TnVtYmVyICAtIERhdGEgZmllbGQgbnVtYmVyICg9ZmllbGQgaW5kZXgrMSkgZnJv +bSB3aGljaCB0aGUgZGF0YSBpcyBjb3BpZWQNCicgICAgIExhc3RGaWVsZE51bWJl +ciAgIC0gRGF0YSBmaWVsZCBudW1iZXIgKD1maWVsZCBpbmRleCsxKSB1cCB0byB3 +aGljaCB0aGUgZGF0YSBhcmUgY29waWVkLiBBIG5lZ2F0aXZlIHZhbHVlIGNvdW50 +cyBmcm9tIGJlaGluZC4NCicgICAgIERhdGFUb0NoYW5nZSAgICAgIC0gZGF0YSB0 +byBiZSBjaGFuZ2VkIC4uLiBhbHRlcm5hdGluZzogZmllbGQgbmFtZSwgZmllbGQg +dmFsdWUgLSBQYXJhbUFycmF5OiAiRmllbGQxIiwgVmFsdWUxLCAiRmllbGQyIiwg +VmFsdWUyLCAuLi4uDQonDQonIFJldHVybnM6DQonICAgICBCb29sZWFuIC0gVHJ1 +ZSBpZiBzdWNjZXNzDQonDQonIFJlbWFya3M6DQonICAgICBTaW5jZSBhIHJlY29y +ZHNldCBpcyB1c2VkIGZvciBpbnNlcnRpb24sIHRoZXJlIGlzIG5vIGRhdGEgdHlw +ZSBjaGVjayBpbiB0aGUgY29kZSAtPiB3YXRjaCBvdXQgZm9yIGltcGxpY2l0IGNv +bnZlcnNpb24uDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gQ29weVJlY29yZHMoQnlWYWwgU291cmNl +IEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5VmFs +IFN0YXJ0RmllbGROdW1iZXIgQXMgTG9uZywgQnlWYWwgTGFzdEZpZWxkTnVtYmVy +IEFzIExvbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUFy +cmF5IERhdGFUb0NoYW5nZSgpIEFzIFZhcmlhbnQpIEFzIEJvb2xlYW4NCiAgICAN +CiAgICBEaW0gbWF4SWR4IEFzIExvbmcNCiAgICBEaW0gdkEoKSBBcyBWYXJpYW50 +DQogICAgRGltIGkgQXMgTG9uZw0KDQogICAgbWF4SWR4ID0gVUJvdW5kKERhdGFU +b0NoYW5nZSkNCiAgICBSZURpbSB2QShtYXhJZHgpDQogICAgDQogICAgRm9yIGkg +PSAwIFRvIG1heElkeA0KICAgICAgICB2QShpKSA9IERhdGFUb0NoYW5nZShpKQ0K +ICAgIE5leHQgaQ0KDQogICAgQ29weVJlY29yZHMgPSBDb3B5UmVjb3Jkc0FycmF5 +UmV0dXJuRmllbGRWYWx1ZShTb3VyY2UsIFN0YXJ0RmllbGROdW1iZXIsIExhc3RG +aWVsZE51bWJlciwgdmJOdWxsU3RyaW5nLCB2QSkNCiANCkVuZCBGdW5jdGlvbg0K +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1 +bmN0aW9uOiBDb3B5UmVjb3Jkc1JldHVybkZpZWxkVmFsdWUNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicvKioNCicgPHN1bW1hcnk+ +DQonIERhdGVuc+R0emUga29waWVyZW4gdW5kIFdlcnRlIORuZGVybg0KJw0KJyBQ +YXJhbWV0ZXJzOg0KJyAgICAgU291cmNlICAgICAgICAgICAgLSBEYXRhIHNvdXJj +ZSAodGFibGUgbmFtZSBvciBTUUwgc3RhdGVtZW50KQ0KJyAgICAgU3RhcnRGaWVs +ZE51bWJlciAgLSBEYXRhIGZpZWxkIG51bWJlciAoPWZpZWxkIGluZGV4KzEpIGZy +b20gd2hpY2ggdGhlIGRhdGEgaXMgY29waWVkDQonICAgICBMYXN0RmllbGROdW1i +ZXIgICAtIERhdGEgZmllbGQgbnVtYmVyICg9ZmllbGQgaW5kZXgrMSkgdXAgdG8g +d2hpY2ggdGhlIGRhdGEgYXJlIGNvcGllZC4gQSBuZWdhdGl2ZSB2YWx1ZSBjb3Vu +dHMgZnJvbSBiZWhpbmQuDQonICAgICBSZXR1cm5GaWVsZE5hbWUgICAtIEZpZWxk +IG5hbWUgd2hvc2UgdmFsdWUgaXMgdG8gYmUgcmV0dXJuZWQgKGUuZy4gYXV0byBu +dW1iZXIgZmllbGQpLg0KJyAgICAgRGF0YVRvQ2hhbmdlICAgICAgLSBkYXRhIHRv +IGJlIGNoYW5nZWQgLi4uIGFsdGVybmF0aW5nOiBmaWVsZCBuYW1lLCBmaWVsZCB2 +YWx1ZSAtIFBhcmFtQXJyYXk6ICJGaWVsZDEiLCBWYWx1ZTEsICJGaWVsZDIiLCBW +YWx1ZTIsIC4uLi4NCicNCicgUmV0dXJuczoNCicgICAgIFZhbHVlIGZyb20gUmV0 +dXJuRmllbGROYW1lLCBvciBUcnVlL0ZhbHNlIGlmIG5vIFJldHVybkZpZWxkTmFt +ZSB3YXMgc3BlY2lmaWVkLg0KJw0KJyBSZW1hcmtzOg0KJyAgICAgU2luY2UgYSBy +ZWNvcmRzZXQgaXMgdXNlZCBmb3IgaW5zZXJ0aW9uLCB0aGVyZSBpcyBubyBkYXRh +IHR5cGUgY2hlY2sgaW4gdGhlIGNvZGUgLT4gd2F0Y2ggb3V0IGZvciBpbXBsaWNp +dCBjb252ZXJzaW9uLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIENvcHlSZWNvcmRzUmV0dXJuRmll +bGRWYWx1ZShCeVZhbCBTb3VyY2UgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAg +ICAgICAgICAgICAgICBCeVZhbCBTdGFydEZpZWxkTnVtYmVyIEFzIExvbmcsIEJ5 +VmFsIExhc3RGaWVsZE51bWJlciBBcyBMb25nLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICBCeVZhbCBSZXR1cm5GaWVsZE5hbWUgQXMgU3RyaW5nLCBfDQog +ICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJhbUFycmF5IERhdGFUb0NoYW5n +ZSgpIEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQNCiAgICANCiAgICBEaW0gbWF4SWR4 +IEFzIExvbmcNCiAgICBEaW0gdkEoKSBBcyBWYXJpYW50DQogICAgRGltIGkgQXMg +TG9uZw0KDQogICAgbWF4SWR4ID0gVUJvdW5kKERhdGFUb0NoYW5nZSkNCiAgICBS +ZURpbSB2QShtYXhJZHgpDQogICAgRm9yIGkgPSAwIFRvIG1heElkeA0KICAgICAg +ICB2QShpKSA9IERhdGFUb0NoYW5nZShpKQ0KICAgIE5leHQgaQ0KICAgIENvcHlS +ZWNvcmRzUmV0dXJuRmllbGRWYWx1ZSA9IENvcHlSZWNvcmRzQXJyYXlSZXR1cm5G +aWVsZFZhbHVlKFNvdXJjZSwgU3RhcnRGaWVsZE51bWJlciwgTGFzdEZpZWxkTnVt +YmVyLCBSZXR1cm5GaWVsZE5hbWUsIHZBKQ0KDQpFbmQgRnVuY3Rpb24NCg0KUHJp +dmF0ZSBGdW5jdGlvbiBDb3B5UmVjb3Jkc0FycmF5UmV0dXJuRmllbGRWYWx1ZShC +eVZhbCBTcWxTb3VyY2UgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAgICAg +ICAgICAgICBCeVZhbCBTdGFydEZlbGRJRCBBcyBMb25nLCBCeVZhbCBMYXN0RmVs +ZElEIEFzIExvbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5VmFs +IFJldHVybkZpZWxkIEFzIFN0cmluZywgQnlSZWYgVXBkYXRlRmllbGRzQW5kVmFs +dWVzKCkgQXMgVmFyaWFudCkgQXMgVmFyaWFudA0KDQpPbiBFcnJvciBHb1RvIEhh +bmRsZUVycg0KDQogICBEaW0gbG5nTnVtIEFzIExvbmcsIGxuZ0FueiBBcyBMb25n +LCBpIEFzIExvbmcsIGlEUyBBcyBMb25nLCBhbnogQXMgTG9uZw0KICAgRGltIHN0 +ckN0bCgpIEFzIFZhcmlhbnQsIHZhbEN0bCgpIEFzIFZhcmlhbnQNCiAgIERpbSBy +c3QgQXMgT2JqZWN0DQogICBEaW0gbG5nTGFzdENvcHlGaWVsZCBBcyBMb25nLCBk +c0FueiBBcyBMb25nLCBTdGFydCBBcyBMb25nDQogICBEaW0gQ29weUZpZWxkc0Fu +ZFZhbHVlcygpIEFzIFZhcmlhbnQNCiAgIERpbSBFcnJObyBBcyBMb25nLCBFcnJE +ZXNjIEFzIFN0cmluZywgRXJyU291cmNlIEFzIFN0cmluZw0KICAgDQogICBsbmdO +dW0gPSBVQm91bmQoVXBkYXRlRmllbGRzQW5kVmFsdWVzKSAtIExCb3VuZChVcGRh +dGVGaWVsZHNBbmRWYWx1ZXMpICsgMQ0KICANCiAgIGFueiA9IDANCiAgIFJlRGlt +IHN0ckN0bCgobG5nTnVtIFwgMikgLSAxKQ0KICAgUmVEaW0gdmFsQ3RsKChsbmdO +dW0gXCAyKSAtIDEpDQogIA0KICAgRm9yIGkgPSAwIFRvIChsbmdOdW0gLSAyKSBT +dGVwIDINCiAgICAgc3RyQ3RsKGFueikgPSBVcGRhdGVGaWVsZHNBbmRWYWx1ZXMo +aSkNCiAgICAgdmFsQ3RsKGFueikgPSBVcGRhdGVGaWVsZHNBbmRWYWx1ZXMoaSAr +IDEpDQogICAgIGFueiA9IGFueiArIDENCiAgIE5leHQgaQ0KICANCiAgIFNldCBy +c3QgPSBNZS5PcGVuUmVjb3Jkc2V0KFNxbFNvdXJjZSwgZGJPcGVuRHluYXNldCkN +CiAgDQogICBJZiByc3QuRU9GIEFuZCByc3QuQk9GIFRoZW4NCiAgICAgICAgIHJz +dC5DbG9zZQ0KICAgICAgICAgU2V0IHJzdCA9IE5vdGhpbmcNCiAgICAgICAgIENv +cHlSZWNvcmRzQXJyYXlSZXR1cm5GaWVsZFZhbHVlID0gMA0KICAgICAgICAgRXhp +dCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgICBXaXRoIHJzdA0KICAgICAg +Lk1vdmVMYXN0DQogICAgICAuTW92ZUZpcnN0DQogICAgICBkc0FueiA9IC5SZWNv +cmRDb3VudA0KICAgICAgDQogICAgICBJZiBMYXN0RmVsZElEID0gMCBUaGVuDQog +ICAgICAgICAgbG5nTGFzdENvcHlGaWVsZCA9IC5GaWVsZHMuQ291bnQNCiAgICAg +IEVsc2VJZiBMYXN0RmVsZElEIDwgMCBUaGVuDQogICAgICAgICAgbG5nTGFzdENv +cHlGaWVsZCA9IC5GaWVsZHMuQ291bnQgKyBMYXN0RmVsZElEDQogICAgICBFbHNl +DQogICAgICAgICAgbG5nTGFzdENvcHlGaWVsZCA9IExhc3RGZWxkSUQNCiAgICAg +IEVuZCBJZg0KICAgICAgDQogICAgICBSZURpbSBDb3B5RmllbGRzQW5kVmFsdWVz +KGRzQW56LCBsbmdMYXN0Q29weUZpZWxkKQ0KICAgICAgDQogICAgICBJZiBTdGFy +dEZlbGRJRCA+IDEgVGhlbiBTdGFydCA9IFN0YXJ0RmVsZElEIC0gMSBFbHNlIFN0 +YXJ0ID0gMA0KICAgICAgDQogICAgICAnUmVhZCB2YWx1ZXMNCiAgICAgIGlEUyA9 +IDANCiAgICAgIFdoaWxlIE5vdCAuRU9GDQogICAgICAgICAgRm9yIGkgPSBTdGFy +dCBUbyBsbmdMYXN0Q29weUZpZWxkIC0gMQ0KICAgICAgICAgICAgICBJZiAuRmll +bGRzKGkpLlR5cGUgPD4gZGJCaW5hcnkgVGhlbg0KICAgICAgICAgICAgICAgICAg +Q29weUZpZWxkc0FuZFZhbHVlcyhpRFMsIGkpID0gLkZpZWxkcyhpKS5WYWx1ZQ0K +ICAgICAgICAgICAgICBFbmQgSWYNCiAgICAgICAgICBOZXh0IGkNCiAgICAgICAg +ICAuTW92ZU5leHQNCiAgICAgICAgICBpRFMgPSBpRFMgKyAxDQogICAgICBXZW5k +DQogICAgICAuTW92ZUxhc3QNCiAgIA0KICAgICAgJ0NvcHkgdmFsdWVzDQogICAg +ICBGb3IgaURTID0gMCBUbyAoZHNBbnogLSAxKQ0KICAgICAgICAgIC5BZGROZXcN +CiAgICAgICAgICBGb3IgaSA9IFN0YXJ0IFRvIChsbmdMYXN0Q29weUZpZWxkIC0g +MSkNCiAgICAgICAgICAgICAgSWYgLkZpZWxkcyhpKS5UeXBlIDw+IGRiQmluYXJ5 +IFRoZW4NCiAgICAgICAgICAgICAgICAgIC5GaWVsZHMoaSkgPSBDb3B5RmllbGRz +QW5kVmFsdWVzKGlEUywgaSkNCiAgICAgICAgICAgICAgRW5kIElmDQogICAgICAg +ICAgTmV4dCBpDQogICAgICAgICAgRm9yIGkgPSAwIFRvIChhbnogLSAxKQ0KICAg +ICAgICAgICAgLkZpZWxkcyhzdHJDdGwoaSkpID0gdmFsQ3RsKGkpDQogICAgICAg +ICAgTmV4dCBpDQogICAgICAgICAgLlVwZGF0ZQ0KICAgICAgTmV4dCBpRFMNCiAg +ICAgIA0KICAgICAgSWYgTGVuKFJldHVybkZpZWxkICYgdmJOdWxsU3RyaW5nKSA+ +IDAgVGhlbg0KICAgICAgICAgIC5Cb29rbWFyayA9IC5MYXN0TW9kaWZpZWQNCiAg +ICAgICAgICBDb3B5UmVjb3Jkc0FycmF5UmV0dXJuRmllbGRWYWx1ZSA9IC5GaWVs +ZHMoUmV0dXJuRmllbGQpDQogICAgICBFbHNlDQogICAgICAgICAgQ29weVJlY29y +ZHNBcnJheVJldHVybkZpZWxkVmFsdWUgPSBUcnVlDQogICAgICBFbmQgSWYNCiAg +ICAgIC5DbG9zZQ0KICAgRW5kIFdpdGgNCiAgDQpFeGl0SGVyZToNCiAgICBTZXQg +cnN0ID0gTm90aGluZw0KICAgIEV4aXQgRnVuY3Rpb24NCiAgICANClJlc3VtZVJh +aXNlRXJyb3I6DQpPbiBFcnJvciBHb1RvIDANCiAgIEVyci5SYWlzZSBFcnJObywg +RXJyU291cmNlLCBFcnJEZXNjDQoNCkhhbmRsZUVycjoNCiAgICBFcnJObyA9IEVy +ci5OdW1iZXINCiAgICBFcnJEZXNjID0gRXJyLkRlc2NyaXB0aW9uDQogICAgRXJy +U291cmNlID0gIkNvcHlSZWNvcmRzQXJyYXlSZXR1cm5GaWVsZFZhbHVlICgiICYg +RXJyLlNvdXJjZSAmICIpIg0KDQogICAgSWYgTm90IChyc3QgSXMgTm90aGluZykg +VGhlbg0KICAgICAgICByc3QuQ2xvc2UNCiAgICBFbmQgSWYNCiAgICBTZXQgcnN0 +ID0gTm90aGluZw0KICAgIFJlc3VtZSBSZXN1bWVSYWlzZUVycm9yDQoNCkVuZCBG +dW5jdGlvbg0K + + 20231011081056 + data/dao/DaoHandler.cls + + + DbConnectionHandler + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIkRiQ29ubmVjdGlvbkhhbmRsZXIi +DQpBdHRyaWJ1dGUgVkJfR2xvYmFsTmFtZVNwYWNlID0gRmFsc2UNCkF0dHJpYnV0 +ZSBWQl9DcmVhdGFibGUgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX1ByZWRlY2xhcmVk +SWQgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX0V4cG9zZWQgPSBGYWxzZQ0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBDbGFzczogZGF0 +YS5EYkNvbm5lY3Rpb25IYW5kbGVyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonIERhdGFiYXNlIGNvbm5lY3Rpb24gdmlhIEFET0RC +IG9yIERBTyAoaW5jbC4gT0RCQykNCicNCicgU3RhbmRhcmRpc2VzIEFETyBhbmQg +REFPIG1ldGhvZHMNCicNCicgQXV0aG9yOg0KJyAgICAgSm9zZWYgUG9ldHpsDQon +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCict +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCic8Y29kZWxp +Yj4NCicgIDxmaWxlPmRhdGEvRGJDb25uZWN0aW9uSGFuZGxlci5jbHM8L2ZpbGU+ +DQonICA8bGljZW5zZT5fY29kZWxpYi9saWNlbnNlLmJhczwvbGljZW5zZT4NCicg +IDx1c2U+ZGF0YS9kYW8vRGFvSGFuZGxlci5jbHM8L3VzZT4NCicgIDx1c2U+ZGF0 +YS9hZG8vQWRvZGJIYW5kbGVyLmNsczwvdXNlPg0KJyAgPHVzZT5kYXRhL29kYmMv +T2RiY0hhbmRsZXIuY2xzPC91c2U+DQonICA8cmVmPjxuYW1lPkRBTzwvbmFtZT48 +bWFqb3I+NTwvbWFqb3I+PG1pbm9yPjA8L21pbm9yPjxndWlkPnswMDAyNUUwMS0w +MDAwLTAwMDAtQzAwMC0wMDAwMDAwMDAwNDZ9PC9ndWlkPjwvcmVmPg0KJyAgPHJl +Zj48bmFtZT5BRE9EQjwvbmFtZT48bWFqb3I+MjwvbWFqb3I+PG1pbm9yPjE8L21p +bm9yPjxndWlkPnswMDAwMDIwMS0wMDAwLTAwMTAtODAwMC0wMEFBMDA2RDJFQTR9 +PC9ndWlkPjwvcmVmPg0KJzwvY29kZWxpYj4NCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCk9wdGlvbiBDb21wYXJlIFRleHQNCk9w +dGlvbiBFeHBsaWNpdA0KDQonT2JqZWt0ZSBm/HIgRGF0ZW56dWdyaWZmDQpQcml2 +YXRlIFdpdGhFdmVudHMgbV9EYW9IYW5kbGVyIEFzIERhb0hhbmRsZXINCkF0dHJp +YnV0ZSBtX0Rhb0hhbmRsZXIuVkJfVmFySGVscElEID0gLTENClByaXZhdGUgV2l0 +aEV2ZW50cyBtX0Fkb2RiSGFuZGxlciBBcyBBZG9kYkhhbmRsZXINCkF0dHJpYnV0 +ZSBtX0Fkb2RiSGFuZGxlci5WQl9WYXJIZWxwSUQgPSAtMQ0KUHJpdmF0ZSBXaXRo +RXZlbnRzIG1fT2RiY0hhbmRsZXIgQXMgT2RiY0hhbmRsZXINCkF0dHJpYnV0ZSBt +X09kYmNIYW5kbGVyLlZCX1ZhckhlbHBJRCA9IC0xDQoNCicgR3JvdXA6IEV2ZW50 +cw0KJyBFcnJvciBldmVudHMgZm9yIHBvc3NpYmxlIGVycm9yIGhhbmRsaW5nIHZp +YSB0aGUgZnJvbnRlbmQgYXBwbGljYXRpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBFdmVudDogRXJyb3JNaXNzaW5nQ3Vy +cmVudERiDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQonIEV2ZW50IGZvciBtaXNzaW5nIEN1cnJlbnREYiByZWZlcmVuY2UNCicgKFBh +c3NpbmcgdGhlIDxkYXRhLmRhby5EYW9IYW5kbGVyPiBvciA8ZGF0YS5vZGJjLk9k +YmNIYW5kbGVyPiBldmVudDogRXJyb3JNaXNzaW5nQ3VycmVudERiKQ0KJw0KJyBQ +YXJhbWV0ZXJzOg0KJyAgICAgTXNnICAgLSAgTWVzc2FnZSBhYm91dCB0aGUgY2F1 +c2Ugb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcuIChOb3QgeWV0IHVzZWQpDQonICAg +ICBOZXdDdXJyZW50RGJSZWYgLSBEQU8uRGF0YWJhc2UgcmVmZXJlbmNlIHRvIGJl +IHVzZWQgZm9yIEN1cnJlbnREYg0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIHJl +cXVpcmVkIERBTy5EYXRhYmFzZSByZWZlcmVuY2UgY2FuIGJlIHBhc3NlZCBvbiB2 +aWEgdGhlIEJ5UmVmIHBhcmFtZXRlciBOZXdDdXJyZW50RGJSZWYuDQonDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRXZl +bnQgRXJyb3JNaXNzaW5nQ3VycmVudERiKEJ5VmFsIE1zZyBBcyBTdHJpbmcsIEJ5 +UmVmIE5ld0N1cnJlbnREYlJlZiBBcyBEQU8uRGF0YWJhc2UpDQoNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRXZlbnQ6IEVycm9y +TWlzc2luZ0N1cnJlbnRDb25uZWN0aW9uDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEV2ZW50IGZvciBtaXNzaW5nIEFET0RC +IGNvbm5lY3Rpb24gcmVmZXJlbmNlDQonIChQYXNzaW5nIHRoZSBBZG9kYkhhbmRs +ZXIgZXZlbnQ6IDxkYXRhLmFkb2RiLkFkb2RiSGFuZGxlcjo6RXJyb3JNaXNzaW5n +Q3VycmVudENvbm5lY3Rpb24+KQ0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgTXNn +ICAgLSAgTWVzc2FnZSBhYm91dCB0aGUgY2F1c2Ugb2YgdGhlIGV2ZW50IHRyaWdn +ZXJpbmcuIChOb3QgeWV0IHVzZWQpDQonICAgICBOZXdDdXJyZW50Q29ubmVjdGlv +biAtIEFET0RCLkNvbm5lY3Rpb25yZWZlcmVuY2UgdG8gYmUgdXNlZCBmb3IgQ3Vy +cmVudENvbm5lY3Rpb24NCicNCicgUmVtYXJrczoNCicgICAgIFRoZSBhcHByb3By +aWF0ZSBBRE9EQi5EYXRhYmFzZSByZWZlcmVuY2UgY2FuIGJlIHBhc3NlZCBvbiB2 +aWEgdGhlIEJ5UmVmIHBhcmFtZXRlciBOZXdDdXJyZW50Q29ubmVjdGlvbi4NCicg +ICAgIEhvd2V2ZXIsIHBhc3Npbmcgb24gYSByZWZlcmVuY2UgaXMgbm90IG1hbmRh +dG9yeSwgc2luY2UsIGl0IGlzIHN0b3JlZCBpbiB0aGUgQWRvZGJIYW5kbGVyIHBy +b3BlcnR5IDxkYXRhLmFkb2RiLkFkb2RiSGFuZGxlcjo6Q3VycmVudENvbm5lY3Rp +b24+Lg0KJyAgICAgVGhlIGNvbm5lY3Rpb24gaXMgdGhlbiBjcmVhdGVkIGZyb20g +dGhlIDxkYXRhLmFkb2RiLkFkb2RiSGFuZGxlcjo6Q29ubmVjdGlvblN0cmluZz4N +CicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1 +YmxpYyBFdmVudCBFcnJvck1pc3NpbmdDdXJyZW50Q29ubmVjdGlvbihCeVZhbCBN +c2cgQXMgU3RyaW5nLCBCeVJlZiBOZXdDdXJyZW50Q29ubmVjdGlvbiBBcyBBRE9E +Qi5Db25uZWN0aW9uKQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonIEV2ZW50OiBFcnJvckVtcHR5T2xlZGJDb25uZWN0aW9uU3Ry +aW5nDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQon +DQonIEV2ZW50IGZvciBtaXNzaW5nIE9MRURCIGNvbm5lY3Rpb24gc3RyaW5nDQon +IChQYXNzaW5nIHRoZSBBZG9kYkhhbmRsZXIgZXZlbnQ6IDxkYXRhLmFkb2RiLkFk +b2RiSGFuZGxlcjo6RXJyb3JFbXB0eU9sZWRiQ29ubmVjdGlvblN0cmluZz4gKQ0K +Jw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgTXNnICAgICAgICAgICAgICAgICAgLSBN +ZXNzYWdlIGFib3V0IHRoZSBjYXVzZSBvZiB0aGUgZXZlbnQgdHJpZ2dlcmluZy4g +KE5vdCB5ZXQgdXNlZCkNCicgICAgIE5ld0Nvbm5lY3Rpb25TdHJpbmcgIC0gT0xF +REIgQ29ubmVjdGlvbnN0cmluZw0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIGFw +cHJvcHJpYXRlIE9MRURCIGNvbm5lY3Rpb24gc3RyaW5nIGNhbiBiZSBwYXNzZWQg +b24gdmlhIHRoZSBCeVJlZiBwYXJhbWV0ZXIgTmV3Q29ubmVjdGlvblN0cmluZy4N +CicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1 +YmxpYyBFdmVudCBFcnJvckVtcHR5T2xlZGJDb25uZWN0aW9uU3RyaW5nKEJ5VmFs +IE1zZyBBcyBTdHJpbmcsIEJ5UmVmIE5ld0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3Ry +aW5nKQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQonIEV2ZW50OiBFcnJvckVtcHR5T2RiY0Nvbm5lY3Rpb25TdHJpbmcNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRXZlbnQg +Zm9yIG1pc3NpbmcgT0RCQyBjb25uZWN0aW9uIHN0cmluZw0KJyAoUGFzc2luZyB0 +aGUgT2RiY0hhbmRsZXIgZXZlbnQ6IDxkYXRhLm9kYmMuT2RiY0hhbmRsZXI6OkVy +cm9yRW1wdHlDb25uZWN0aW9uU3RyaW5nPikNCicNCicgUGFyYW1ldGVyczoNCicg +ICAgIE1zZyAgICAgICAgICAgICAgICAgIC0gTWVzc2FnZSBhYm91dCB0aGUgY2F1 +c2Ugb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcuIChOb3QgeWV0IHVzZWQpDQonICAg +ICBOZXdDb25uZWN0aW9uU3RyaW5nICAtIE9EQkMtQ29ubmVjdGlvbnN0cmluZw0K +Jw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIGFwcHJvcHJpYXRlIE9EQkMgY29ubmVj +dGlvbiBzdHJpbmcgY2FuIGJlIHBhc3NlZCBvbiB2aWEgdGhlIEJ5UmVmIHBhcmFt +ZXRlciBOZXdDb25uZWN0aW9uU3RyaW5nLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IEVycm9yRW1wdHlP +ZGJjQ29ubmVjdGlvblN0cmluZyhCeVZhbCBNc2cgQXMgU3RyaW5nLCBCeVJlZiBO +ZXdDb25uZWN0aW9uU3RyaW5nIEFzIFN0cmluZykNCg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBFdmVudDogRGlzcG9zZWQNCict +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRXZl +bnQgbWVzc2FnZSB3aGVuIG9iamVjdCByZWZlcmVuY2VzIGhhdmUgYmVlbiByZW1v +dmVkDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQpQdWJsaWMgRXZlbnQgRGlzcG9zZWQoKQ0KDQoNCicgR3JvdXA6IERpc3Bvc2Ug +c3VwcG9ydA0KDQpQcml2YXRlIG1fRGlzcG9zZWQgQXMgQm9vbGVhbg0KDQonDQon +IEluaXQgLyBUZXJtaW5hdGUNCicgLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJ1ByaXZh +dGUgU3ViIENsYXNzX0luaXRpYWxpemUoKQ0KJycNCidFbmQgU3ViDQoNClByaXZh +dGUgU3ViIENsYXNzX1Rlcm1pbmF0ZSgpDQogICBEaXNwb3NlDQpFbmQgU3ViDQoN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgU3Vi +OiBEaXNwb3NlDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIFJlbW92ZSBvYmplY3QgcmVmZXJlbmNlcw0KJw0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFN1YiBEaXNw +b3NlKCkNCg0KICAgSWYgbV9EaXNwb3NlZCBUaGVuIEV4aXQgU3ViDQoNCk9uIEVy +cm9yIFJlc3VtZSBOZXh0DQoNCiAgIENsZWFyT2JqZWN0UmVmZXJlbmNlcw0KICAg +DQogICBtX0Rpc3Bvc2VkID0gVHJ1ZQ0KICAgUmFpc2VFdmVudCBEaXNwb3NlZA0K +ICAgDQpFbmQgU3ViDQoNClByaXZhdGUgU3ViIENsZWFyT2JqZWN0UmVmZXJlbmNl +cygpDQoNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQoNCiAgIElmIE5vdCBtX0Fkb2Ri +SGFuZGxlciBJcyBOb3RoaW5nIFRoZW4NCiAgICAgIG1fQWRvZGJIYW5kbGVyLkRp +c3Bvc2UNCiAgICAgIFNldCBtX0Fkb2RiSGFuZGxlciA9IE5vdGhpbmcNCiAgIEVu +ZCBJZg0KICAgDQogICBJZiBOb3QgbV9EYW9IYW5kbGVyIElzIE5vdGhpbmcgVGhl +bg0KICAgICAgbV9EYW9IYW5kbGVyLkRpc3Bvc2UNCiAgICAgIFNldCBtX0Rhb0hh +bmRsZXIgPSBOb3RoaW5nDQogICBFbmQgSWYNCiAgIA0KICAgSWYgTm90IG1fT2Ri +Y0hhbmRsZXIgSXMgTm90aGluZyBUaGVuDQogICAgICBtX09kYmNIYW5kbGVyLkRp +c3Bvc2UNCiAgICAgIFNldCBtX09kYmNIYW5kbGVyID0gTm90aGluZw0KICAgRW5k +IElmDQogICANCkVuZCBTdWINCg0KDQonIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjDQonIEdyb3VwOiBEQU8gZGF0YSBjb25uZWN0aW9uDQon +IERBTyBhY2Nlc3MgbWV0aG9kcw0KJyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonIFByb3BlcnR5OiBEQU8NCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgSW5zdGFuY2Ugb2YgPGRhdGEuZGFv +LkRhb0hhbmRsZXI+DQonDQonIFJldHVybnM6DQonICAgICA8ZGF0YS5kYW8uRGFv +SGFuZGxlcj4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQgREFPKCkgQXMgRGFvSGFuZGxlcg0K +ICAgSWYgbV9EYW9IYW5kbGVyIElzIE5vdGhpbmcgVGhlbg0KICAgICAgU2V0IG1f +RGFvSGFuZGxlciA9IE5ldyBEYW9IYW5kbGVyDQogICBFbmQgSWYNCiAgIFNldCBE +QU8gPSBtX0Rhb0hhbmRsZXINCkVuZCBQcm9wZXJ0eQ0KDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFByb3BlcnR5OiBDdXJyZW50 +RGINCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicN +CicgQ3VycmVudERiID0gPGRhdGEuZGFvLkRhb0hhbmRsZXI6OkN1cnJlbnREYj4N +CicNCicgUmV0dXJuczoNCicgICAgIERBTy5EYXRhYmFzZQ0KJw0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5 +IEdldCBDdXJyZW50RGIoKSBBcyBEQU8uRGF0YWJhc2UNCiAgIFNldCBDdXJyZW50 +RGIgPSBNZS5EQU8uQ3VycmVudERiDQpFbmQgUHJvcGVydHkNCg0KUHVibGljIFBy +b3BlcnR5IFNldCBDdXJyZW50RGIoQnlSZWYgTmV3Q3VycmVudERiIEFzIERBTy5E +YXRhYmFzZSkNCiAgIFNldCBNZS5EQU8uQ3VycmVudERiID0gTmV3Q3VycmVudERi +DQpFbmQgUHJvcGVydHkNCg0KDQonIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjDQonIEdyb3VwOiBBRE9EQiBkYXRhIGNvbm5lY3Rpb24NCicg +QURPREIgYWNjZXNzIG1ldGhvZHMNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogQURPREINCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgSW5zdGFuY2Ugb2YgPGRhdGEu +YWRvZGIuQWRvZGJIYW5kbGVyPg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgPGRhdGEu +YWRvZGIuQWRvZGJIYW5kbGVyPg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBBRE9EQigpIEFz +IEFkb2RiSGFuZGxlcg0KICAgSWYgbV9BZG9kYkhhbmRsZXIgSXMgTm90aGluZyBU +aGVuDQogICAgICBTZXQgbV9BZG9kYkhhbmRsZXIgPSBOZXcgQWRvZGJIYW5kbGVy +DQogICBFbmQgSWYNCiAgIFNldCBBRE9EQiA9IG1fQWRvZGJIYW5kbGVyDQpFbmQg +UHJvcGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KJyBQcm9wZXJ0eTogQ3VycmVudENvbm5lY3Rpb24NCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQURPREIgY29ubmVj +dGlvbiB0byB0aGUgY3VycmVudCBEQk1TIGNvbm5lY3Rpb24gPSA8ZGF0YS5hZG9k +Yi5BZG9kYkhhbmRsZXI6OkN1cnJlbnRDb25uZWN0aW9uPg0KJw0KJyBSZXR1cm5z +Og0KJyAgICAgQURPREIuQ29ubmVjdGlvbg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBDdXJy +ZW50Q29ubmVjdGlvbigpIEFzIEFET0RCLkNvbm5lY3Rpb24NCiAgIFNldCBDdXJy +ZW50Q29ubmVjdGlvbiA9IE1lLkFET0RCLkN1cnJlbnRDb25uZWN0aW9uDQpFbmQg +UHJvcGVydHkNCg0KUHVibGljIFByb3BlcnR5IFNldCBDdXJyZW50Q29ubmVjdGlv +bihCeVJlZiBOZXdDb25uZWN0aW9uIEFzIEFET0RCLkNvbm5lY3Rpb24pDQogICBT +ZXQgTWUuQURPREIuQ3VycmVudENvbm5lY3Rpb24gPSBOZXdDb25uZWN0aW9uDQpF +bmQgUHJvcGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KJyBQcm9wZXJ0eTogT2xlZGJDb25uZWN0aW9uU3RyaW5nDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIE9sZWRi +Q29ubmVjdGlvblN0cmluZyA9IDxkYXRhLmFkb2RiLkFkb2RiSGFuZGxlcjo6Q29u +bmVjdGlvblN0cmluZz4NCicNCicgUmV0dXJuczoNCicgICAgIFN0cmluZw0KJw0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KRnJpZW5k +IFByb3BlcnR5IEdldCBPbGVkYkNvbm5lY3Rpb25TdHJpbmcoKSBBcyBTdHJpbmcN +CiAgIE9sZWRiQ29ubmVjdGlvblN0cmluZyA9IE1lLkFET0RCLkNvbm5lY3Rpb25T +dHJpbmcNCkVuZCBQcm9wZXJ0eQ0KDQpQdWJsaWMgUHJvcGVydHkgTGV0IE9sZWRi +Q29ubmVjdGlvblN0cmluZyhCeVZhbCBOZXdDb25uZWN0aW9uU3RyaW5nIEFzIFN0 +cmluZykNCiAgIE1lLkFET0RCLkNvbm5lY3Rpb25TdHJpbmcgPSBOZXdDb25uZWN0 +aW9uU3RyaW5nDQpFbmQgUHJvcGVydHkNCg0KDQonIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjDQonIEdyb3VwOiBPREJDIGRhdGEgY29ubmVj +dGlvbg0KJyBPREJDIGFjY2VzcyBtZXRob2RzDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IE9EQkMNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgSW5zdGFuY2Ugb2Yg +PGRhdGEub2RiYy5PZGJjSGFuZGxlcj4NCicNCicgUmV0dXJuczoNCicgICAgIDxk +YXRhLm9kYmMuT2RiY0hhbmRsZXI+DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJvcGVydHkgR2V0IE9EQkMoKSBB +cyBPZGJjSGFuZGxlcg0KICAgSWYgbV9PZGJjSGFuZGxlciBJcyBOb3RoaW5nIFRo +ZW4NCiAgICAgU2V0IG1fT2RiY0hhbmRsZXIgPSBOZXcgT2RiY0hhbmRsZXINCiAg +IEVuZCBJZg0KICAgU2V0IE9EQkMgPSBtX09kYmNIYW5kbGVyDQpFbmQgUHJvcGVy +dHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +JyBQcm9wZXJ0eTogT2RiY0Nvbm5lY3Rpb25TdHJpbmcNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgT2RiY0Nvbm5lY3Rpb25T +dHJpbmcgPSA8ZGF0YS5vZGJjLk9kYmNIYW5kbGVyOjpDb25uZWN0aW9uU3RyaW5n +Pg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgU3RyaW5nDQonDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpGcmllbmQgUHJvcGVydHkgR2V0 +IE9kYmNDb25uZWN0aW9uU3RyaW5nKCkgQXMgU3RyaW5nDQogICBPZGJjQ29ubmVj +dGlvblN0cmluZyA9IE1lLk9EQkMuQ29ubmVjdGlvblN0cmluZw0KRW5kIFByb3Bl +cnR5DQoNClB1YmxpYyBQcm9wZXJ0eSBMZXQgT2RiY0Nvbm5lY3Rpb25TdHJpbmco +QnlWYWwgTmV3Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcpDQogICBNZS5PREJD +LkNvbm5lY3Rpb25TdHJpbmcgPSBOZXdDb25uZWN0aW9uU3RyaW5nDQpFbmQgUHJv +cGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJyBQcm9wZXJ0eTogQ3VycmVudERiQkUNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQ3VycmVudERiQkUgPSA8ZGF0YS5v +ZGJjLk9kYmNIYW5kbGVyOjpDdXJyZW50RGJCRT4NCicNCicgUmV0dXJuczoNCicg +ICAgIERBTy5EYXRhYmFzZSBvZiBPREJDIGRhdGFiYXNlDQonDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJvcGVydHkg +R2V0IEN1cnJlbnREYkJFKCkgQXMgREFPLkRhdGFiYXNlDQogICBTZXQgQ3VycmVu +dERiQkUgPSBNZS5PREJDLkN1cnJlbnREYkJFDQpFbmQgUHJvcGVydHkNCg0KUHVi +bGljIFByb3BlcnR5IFNldCBDdXJyZW50RGJCRShCeVJlZiBOZXdEYiBBcyBEQU8u +RGF0YWJhc2UpDQogICBJZiBOb3QgKE5ld0RiIElzIE5vdGhpbmcpIFRoZW4NCiAg +ICAgIFNldCBNZS5PREJDLkN1cnJlbnREYkJFID0gTmV3RGINCiAgIEVuZCBJZg0K +RW5kIFByb3BlcnR5DQoNCg0KJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIw0KJw0KJyBEYXRhIGFjY2VzcyBldmVudHMNCicgLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KDQonIEFkb2RiSGFuZGxlciBldmVudHMNCicgLS0tLS0tLS0t +LS0tLS0tLS0tLS0NClByaXZhdGUgU3ViIG1fQWRvZGJIYW5kbGVyX0Vycm9yTWlz +c2luZ0N1cnJlbnRDb25uZWN0aW9uKEJ5VmFsIE1zZyBBcyBTdHJpbmcsIEJ5UmVm +IE5ld0N1cnJlbnRDb25uZWN0aW9uIEFzIEFET0RCLkNvbm5lY3Rpb24pDQogICBS +YWlzZUV2ZW50IEVycm9yTWlzc2luZ0N1cnJlbnRDb25uZWN0aW9uKE1zZywgTmV3 +Q3VycmVudENvbm5lY3Rpb24pDQpFbmQgU3ViDQoNClByaXZhdGUgU3ViIG1fQWRv +ZGJIYW5kbGVyX0Vycm9yRW1wdHlDb25uZWN0aW9uU3RyaW5nKEJ5VmFsIE1zZyBB +cyBTdHJpbmcsIEJ5UmVmIE5ld0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nKQ0K +ICAgUmFpc2VFdmVudCBFcnJvckVtcHR5T2xlZGJDb25uZWN0aW9uU3RyaW5nKE1z +ZywgTmV3Q29ubmVjdGlvblN0cmluZykNCkVuZCBTdWINCg0KJyBEYW9IYW5kbGVy +IGV2ZW50cw0KJyAtLS0tLS0tLS0tLS0tLS0tLS0NClByaXZhdGUgU3ViIG1fRGFv +SGFuZGxlcl9FcnJvck1pc3NpbmdDdXJyZW50RGIoQnlWYWwgTXNnIEFzIFN0cmlu +ZywgQnlSZWYgTmV3Q3VycmVudERiUmVmIEFzIERBTy5EYXRhYmFzZSkNCiAgIFJh +aXNlRXZlbnQgRXJyb3JNaXNzaW5nQ3VycmVudERiKE1zZywgTmV3Q3VycmVudERi +UmVmKQ0KRW5kIFN1Yg0KDQonIE9kYmNIYW5kbGVyIGV2ZW50cw0KJyAtLS0tLS0t +LS0tLS0tLS0tLS0NClByaXZhdGUgU3ViIG1fT2RiY0hhbmRsZXJfRXJyb3JFbXB0 +eUNvbm5lY3Rpb25TdHJpbmcoQnlWYWwgTXNnIEFzIFN0cmluZywgQnlSZWYgTmV3 +Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcpDQogICBSYWlzZUV2ZW50IEVycm9y +RW1wdHlPZGJjQ29ubmVjdGlvblN0cmluZyhNc2csIE5ld0Nvbm5lY3Rpb25TdHJp +bmcpDQpFbmQgU3ViDQoNClByaXZhdGUgU3ViIG1fT2RiY0hhbmRsZXJfRXJyb3JN +aXNzaW5nQ3VycmVudERiKEJ5VmFsIE1zZyBBcyBTdHJpbmcsIEJ5UmVmIE5ld0N1 +cnJlbnREYlJlZiBBcyBEQU8uRGF0YWJhc2UpDQoNCiAgICcxLiBUcnkgdG8gcGFz +cyBmcm9tIERBTyBjbGFzczoNCiAgIFNldCBOZXdDdXJyZW50RGJSZWYgPSBNZS5E +QU8uQ3VycmVudERiDQogICANCiAgICcyLiBUcmlnZ2VyIGV2ZW50IGlmIE1lLkRB +Ty5DdXJyZW50RGIgYWxzbyByZXR1cm5zIG5vdGhpbmcNCiAgIElmIE5ld0N1cnJl +bnREYlJlZiBJcyBOb3RoaW5nIFRoZW4NCiAgICAgIFJhaXNlRXZlbnQgRXJyb3JN +aXNzaW5nQ3VycmVudERiKE1zZywgTmV3Q3VycmVudERiUmVmKQ0KICAgICAgSWYg +Tm90IE5ld0N1cnJlbnREYlJlZiBJcyBOb3RoaW5nIFRoZW4NCiAgICAgICAgIFNl +dCBNZS5EQU8uQ3VycmVudERiID0gTmV3Q3VycmVudERiUmVmDQogICAgICBFbmQg +SWYNCiAgIEVuZCBJZg0KICAgDQpFbmQgU3ViDQo= + + 20231011081056 + data/DbConnectionHandler.cls + + + DbConnectionInfo + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIkRiQ29ubmVjdGlvbkluZm8iDQpB +dHRyaWJ1dGUgVkJfR2xvYmFsTmFtZVNwYWNlID0gRmFsc2UNCkF0dHJpYnV0ZSBW +Ql9DcmVhdGFibGUgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX1ByZWRlY2xhcmVkSWQg +PSBGYWxzZQ0KQXR0cmlidXRlIFZCX0V4cG9zZWQgPSBGYWxzZQ0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBDbGFzczogZGF0YS5E +YkNvbm5lY3Rpb25JbmZvDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonIEF1eGlsaWFyeSBjbGFzcyBmb3Igc2V0dGluZyB0aGUgY29u +bmVjdGlvbiBwYXJhbWV0ZXJzDQonDQonIEF1dGhvcjoNCicgICAgIEpvc2VmIFBv +ZXR6bA0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVXNlcyB0YWJsZSB1c3lzX0RibXND +b25uZWN0aW9uIChjcmVhdGUgdGFibGUgd2l0aCBEQk1TIENvbm5lY3Rpb24gV2l6 +YXJkKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQon +PGNvZGVsaWI+DQonICA8ZmlsZT5kYXRhL0RiQ29ubmVjdGlvbkluZm8uY2xzPC9m +aWxlPg0KJyAgPGxpY2Vuc2U+X2NvZGVsaWIvbGljZW5zZS5iYXM8L2xpY2Vuc2U+ +DQonICA8cmVmPjxuYW1lPkRBTzwvbmFtZT48bWFqb3I+NTwvbWFqb3I+PG1pbm9y +PjA8L21pbm9yPjxndWlkPnswMDAyNUUwMS0wMDAwLTAwMDAtQzAwMC0wMDAwMDAw +MDAwNDZ9PC9ndWlkPjwvcmVmPg0KJyAgPHVzZT5kYXRhL2RlZkRiQ29ubmVjdGlv +bi5iYXM8L3VzZT4NCic8L2NvZGVsaWI+DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonDQpPcHRpb24gQ29tcGFyZSBUZXh0DQpPcHRp +b24gRXhwbGljaXQNCg0KUHJpdmF0ZSBFbnVtIERiQ29ubmVjdGlvbkluZm9FcnJv +ck51bWJlcnMNCiAgIEVSUk5SX05PREJNUyA9IHZiT2JqZWN0RXJyb3IgKyAxDQog +ICBFUlJOUl9OT0NPTkZJRyA9IHZiT2JqZWN0RXJyb3IgKyAyDQogICBFUlJOUl9J +TkFDVElWRSA9IHZiT2JqZWN0RXJyb3IgKyAzDQpFbmQgRW51bQ0KDQpQcml2YXRl +IENvbnN0IENvbm5EYXRhU2VsZWN0U3FsIEFzIFN0cmluZyA9IF8NCiAgICAgICAg +ICAgICAgICAgICAgICJTRUxFQ1QgQ0lELCBEQk1TLCBkYm1zQ29ubmVjdGlvbk1v +ZGUsIGRibXNEYXRhYmFzZSwgZGJtc1VzZVRydXN0ZWRDb25uZWN0aW9uLCBkYm1z +VXNlciwgZGJtc1B3ZCwgZGJtc1VzZUxvZ2luRm9ybSwgIiAmIF8NCiAgICAgICAg +ICAgICAgICAgICAgICIgZGJtc1NlcnZlciwgZGJtc1BvcnQsIGRibXNPbGVEYlBy +b3ZpZGVyLCBkYm1zT2RiY0RyaXZlciwgZGJtc09wdGlvbnNPTEVEQiwgZGJtc09w +dGlvbnNPREJDLCIgJiBfDQogICAgICAgICAgICAgICAgICAgICAiIGRibXNEU04s +IGRibXNDb25TdHJPTEVEQiwgZGJtc0NvblN0ck9EQkMgRlJPTSB1c3lzX0RibXND +b25uZWN0aW9uIg0KDQpQcml2YXRlIENvbnN0IEFjdGl2YXRlZENvbm5EYXRhU2Vs +ZWN0U3FsIEFzIFN0cmluZyA9IF8NCiAgICAgICAgICAgICAgICAgICAgIENvbm5E +YXRhU2VsZWN0U3FsICYgIiBXSEVSRSBBY3RpdmVDb25uZWN0aW9uPS0xIg0KDQpQ +cml2YXRlIENvbnN0IFNlbGVjdENvbm5lY3Rpb25JZGVudGlmaWVyQ29ubkRhdGFT +ZWxlY3RTcWwgQXMgU3RyaW5nID0gXw0KICAgICAgICAgICAgICAgICAgICAgQ29u +bkRhdGFTZWxlY3RTcWwgJiAiIFdIRVJFIENJRD17Q29ubmVjdGlvbklkZW50aWZp +ZXJ9Ig0KDQoNClByaXZhdGUgQ29uc3QgbV9EZWZhdWx0TG9naW5Gb3JtTmFtZSBB +cyBTdHJpbmcgPSAiTG9naW5Gb3JtIg0KUHJpdmF0ZSBtX0xvZ2luRm9ybU5hbWUg +QXMgU3RyaW5nDQpQcml2YXRlIG1fRGJtc0NvbmZpZ0Zvcm1OYW1lIEFzIFN0cmlu +Zw0KDQpQcml2YXRlIENvbnN0IG1fQ2hlY2tDb25uZWN0aW9uVGltZW91dFNlY29u +ZHMgQXMgTG9uZyA9IDUgJ0Nvbm5lY3Rpb24gdGltZW91dCBbc2VjXSBmb3IgY29u +bmVjdGlvbiBjaGVjayAoZGVmYXVsdCB3b3VsZCBiZSAxNSBzZWMpDQoNCidDb25u +ZWN0aW9uIGlkZW50aWZpZXINClByaXZhdGUgbV9Db25uZWN0aW9uSWRlbnRpZmll +ciBBcyBTdHJpbmcNCg0KJ0RCTVMgTmFtZQ0KUHJpdmF0ZSBtX0RCTVNOQU1FIEFz +IFN0cmluZw0KDQpQcml2YXRlIENvbnN0IG1fREJNU05BTUVfTVNKRVQgQXMgU3Ry +aW5nID0gIk1TSkVUIg0KUHJpdmF0ZSBDb25zdCBtX0RCTVNOQU1FX01TU1FMIEFz +IFN0cmluZyA9ICJNU1NRTCINClByaXZhdGUgQ29uc3QgbV9EQk1TTkFNRV9NWVNR +TCBBcyBTdHJpbmcgPSAiTXlTUUwiDQpQcml2YXRlIENvbnN0IG1fREJNU05BTUVf +T1JBQ0xFIEFzIFN0cmluZyA9ICJPUkFDTEUiDQpQcml2YXRlIENvbnN0IG1fREJN +U05BTUVfT0RCQyBBcyBTdHJpbmcgPSAiT0RCQyINCiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgDQonREJNUyBQcm92aWRlci9Ecml2ZXINClByaXZhdGUgbV9E +Qk9EQkNEUklWRVIgQXMgU3RyaW5nDQpQcml2YXRlIG1fREJPTEVEQlBST1ZJREVS +IEFzIFN0cmluZw0KDQonRGF0YWJhc2UgU2VydmVyIChOb3RlOiBpbmNsLiBpbnN0 +YW5jZSBvZiBTUUwgc2VydmVyICYgY28uKQ0KUHJpdmF0ZSBtX0RCU0VSVkVSIEFz +IFN0cmluZw0KDQonUG9ydCAoZS5nLiB0byBpZGVudGlmeSBleGlzdGluZyBzZXJ2 +ZXIgaW5zdGFuY2VzKQ0KUHJpdmF0ZSBtX1BPUlQgQXMgU3RyaW5nDQoNCidEYXRh +YmFzZSBOYW1lDQpQcml2YXRlIG1fREJOQU1FIEFzIFN0cmluZyAgJ3JlcXVpcmVk +IQ0KDQonQ29ubmVjdGlvbiBtb2RlcyAoMSAuLiBETlMgbGVzcywgMiAuLiB3aXRo +IERTTiwgMTI4IC4uIHVzZWRlZmluZWQgY29ubmVjdGlvbiBzdHJpbmcpDQpQcml2 +YXRlIG1fQ09OTkVDVElPTk1PREUgQXMgRGJtc0Nvbm5lY3Rpb25Nb2Rlcw0KDQon +VXNlciBpZGVudGlmaWVyDQpQcml2YXRlIG1fREJVU0VSIEFzIFN0cmluZw0KUHJp +dmF0ZSBtX0RCVVNFUlBXRCBBcyBTdHJpbmcNClByaXZhdGUgbV9UUlVTVEVEQ09O +TkVDVElPTiBBcyBCb29sZWFuDQoNCidPdGhlciBPcHRpb25zDQpQcml2YXRlIG1f +REJPUFRJT05TX09EQkMgQXMgU3RyaW5nDQpQcml2YXRlIG1fREJPUFRJT05TX09M +RURCIEFzIFN0cmluZw0KDQonQ29ubmVjdGlvbiBzdHJpbmcNClByaXZhdGUgbV9P +bGVkYkNvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nDQpQcml2YXRlIG1fT2RiY0Nv +bm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nDQpQcml2YXRlIG1fRGF0YWJhc2VGaWxl +IEFzIFN0cmluZyAnZvxyIGRhdGVpYmFzaWVydGUgREJTDQoNCidMb2dpbiBmb3Jt +DQpQcml2YXRlIG1fVXNlTG9naW5Gb3JtIEFzIEJvb2xlYW4NClByaXZhdGUgbV9T +QVZFUFdEIEFzIEJvb2xlYW4NCg0KI0lmIENPTkZJR19VU0VMT0dJTkZPUk0gPSAx +IFRoZW4NClByaXZhdGUgV2l0aEV2ZW50cyBtX0xvZ2luRm9ybSBBcyBGb3JtX0xv +Z2luRm9ybQ0KQXR0cmlidXRlIG1fTG9naW5Gb3JtLlZCX1ZhckhlbHBJRCA9IC0x +DQojRW5kIElmDQoNClByaXZhdGUgbV9Mb2dpbkNhbmNlbGxlZCBBcyBCb29sZWFu +DQoNCidEU04NClByaXZhdGUgbV9EU04gQXMgU3RyaW5nDQoNCidPdGhlciBhdXhp +bGlhcnkgdmFyaWFibGVzOg0KUHJpdmF0ZSBtX0RibXNJbmZvUmVhZGVkIEFzIEJv +b2xlYW4NCg0KJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIw0KJw0KJyBHcm91cDogRXZlbnRzDQonDQoNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCidFdmVudDogRGJtc0Nv +bm5lY3Rpb25DaGFuZ2VkDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonDQonIEV2ZW50IHdoZW4gdGhlIGNvbm5lY3Rpb24gY2hhbmdl +cw0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgTmV3Q29ubmVjdGlvbklkZW50aWZp +ZXIgLSBuZXcgdXNlZCBjb25uZWN0aW9uIGlkZW50aWZpZXIgKGZyb20gdGFibGUg +ZGF0YSBmaWVsZCBDSUQpDQonDQonIFJlbWFya3M6DQonICAgICBDYW4gYmUgdXNl +ZnVsIGlmIGRpc3BsYXlzIGFyZSB1cGRhdGVkIGRlcGVuZGluZyBvbiB0aGUgY29u +bmVjdGlvbiwgZXRjLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IERibXNDb25uZWN0aW9uQ2hhbmdlZChC +eVZhbCBOZXdDb25uZWN0aW9uSWRlbnRpZmllciBBcyBTdHJpbmcpDQoNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCidFdmVudDogRGJt +c0Nvbm5lY3Rpb25JbmZvQ2xlYXJlZA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBFdmVudCByYWlzZWQgd2hlbiB0aGUgY29u +bmVjdGlvbiBwYXJhbWV0ZXJzIGhhdmUgYmVlbiByZXNldA0KJw0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IERi +bXNDb25uZWN0aW9uSW5mb0NsZWFyZWQoKQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonRXZlbnQ6IERibXNJbmZvTWVzc2FnZQ0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBJ +bmZvcm1hdGlvbiBzaGFyaW5nIGV2ZW50DQonDQonIFBhcmFtZXRlcnM6DQonICAg +ICBTb3VyY2UgICAgICAgICAtIFNvdXJjZSBvZiB0aGUgbWVzc2FnZQ0KJyAgICAg +TXNnICAgICAgICAgICAgLSBNZXNzYWdlDQonICAgICBNc2dTdHlsZSAgICAgICAt +IFZiTXNnQm94U3R5bGUNCicNCicgUmVtYXJrczoNCicgICAgIFVzZWQgdG8gcGFz +cyBvbiBpbmZvIChzaW1pbGFyIHRvIGRlYnVnLnByaW50KQ0KJw0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IERi +bXNJbmZvTWVzc2FnZShCeVZhbCBTb3VyY2UgQXMgU3RyaW5nLCBCeVZhbCBNc2cg +QXMgU3RyaW5nLCBCeVZhbCBNc2dTdHlsZSBBcyBWYk1zZ0JveFN0eWxlKQ0KDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonRXZlbnQ6 +IExvZ2luRGF0YVJlcXVpcmVkDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonDQonIEV2ZW50IHJhaXNlZCB3aGVuIHVzZXJuYW1lIGFu +ZCBwYXNzd29yZCByZXF1aXJlZA0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIGV2 +ZW50IGlzIHVzZWZ1bCB0byBzZXQgYSBwYXNzd29yZCBieSBjb2RlDQonICAgICBz +byB0aGF0IGl0IGlzIG5vdCBzdG9yZWQgaW4gdGhlIHRhYmxlIGFuZCBpcyBlYXNp +bHkgcmVhZGFibGUuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQpQdWJsaWMgRXZlbnQgTG9naW5EYXRhUmVxdWlyZWQoQnlSZWYg +VXNlck5hbWUgQXMgU3RyaW5nLCBCeVJlZiBQYXNzd29yZCBBcyBTdHJpbmcpDQoN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCidFdmVu +dDogUGFzc3dvcmRDaGFuZ2VkDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonDQonIEV2ZW50IHJhaXNlZCB3aGVuIHRoZSBwYXNzd29y +ZCBoYXMgYmVlbiBjaGFuZ2VkDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRXZlbnQgUGFzc3dvcmRDaGFuZ2VkKCkN +Cg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJ0V2 +ZW50OiBEaXNwb3NlZA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KJw0KJyBFdmVudCByYWlzZWQgd2hlbiBkaXNwb3NlZA0KJw0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2 +ZW50IERpc3Bvc2VkKCkNCg0KDQonQVBJDQpQcml2YXRlIERlY2xhcmUgUHRyU2Fm +ZSBGdW5jdGlvbiBHZXRQcml2YXRlUHJvZmlsZVN0cmluZyBMaWIgImtlcm5lbDMy +IiBfDQogIEFsaWFzICJHZXRQcml2YXRlUHJvZmlsZVN0cmluZ0EiICggXw0KICBC +eVZhbCBscEFwcGxpY2F0aW9uTmFtZSBBcyBTdHJpbmcsIF8NCiAgQnlWYWwgbHBL +ZXlOYW1lIEFzIEFueSwgXw0KICBCeVZhbCBscERlZmF1bHQgQXMgU3RyaW5nLCBf +DQogIEJ5VmFsIGxwUmV0dXJuZWRTdHJpbmcgQXMgU3RyaW5nLCBfDQogIEJ5VmFs +IG5TaXplIEFzIExvbmcsIF8NCiAgQnlWYWwgbHBGaWxlTmFtZSBBcyBTdHJpbmcp +IEFzIExvbmcNCg0KUHJpdmF0ZSBEZWNsYXJlIFB0clNhZmUgRnVuY3Rpb24gV3Jp +dGVQcml2YXRlUHJvZmlsZVN0cmluZyBMaWIgImtlcm5lbDMyIiBfDQogIEFsaWFz +ICJXcml0ZVByaXZhdGVQcm9maWxlU3RyaW5nQSIgKCBfDQogIEJ5VmFsIGxwQXBw +bGljYXRpb25OYW1lIEFzIFN0cmluZywgXw0KICBCeVZhbCBscEtleU5hbWUgQXMg +QW55LCBfDQogIEJ5VmFsIGxwU3RyaW5nIEFzIEFueSwgXw0KICBCeVZhbCBscEZp +bGVOYW1lIEFzIFN0cmluZykgQXMgTG9uZw0KICANClByaXZhdGUgU3ViIENsYXNz +X1Rlcm1pbmF0ZSgpDQpPbiBFcnJvciBSZXN1bWUgTmV4dA0KICAgRGlzcG9zZQ0K +RW5kIFN1Yg0KDQpQcml2YXRlIFN1YiBEaXNwb3NlKCkNCk9uIEVycm9yIFJlc3Vt +ZSBOZXh0DQojSWYgQ09ORklHX1VTRUxPR0lORk9STSA9IDEgVGhlbg0KICAgSWYg +Tm90IChtX0xvZ2luRm9ybSBJcyBOb3RoaW5nKSBUaGVuIFNldCBtX0xvZ2luRm9y +bSA9IE5vdGhpbmcNCiNFbmQgSWYNCiAgIG1fRGJtc0luZm9SZWFkZWQgPSBGYWxz +ZQ0KICAgUmFpc2VFdmVudCBEaXNwb3NlZA0KRW5kIFN1Yg0KDQogIA0KJyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0K +Jw0KJyBHcm91cDogREJNUyBDb25uZWN0aW9uIFBhcmFtZXRlcnMNCicNCiAgDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonUHJvcGVy +dHk6IENvbm5lY3Rpb25JZGVudGlmaWVyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIENvbm5lY3Rpb24gaWRlbnRpZmllciAt +IHZhbHVlIGZyb20gZGF0YSBmaWVsZCBDSUQNCicNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQgQ29u +bmVjdGlvbklkZW50aWZpZXIoKSBBcyBTdHJpbmcNCk9uIEVycm9yIFJlc3VtZSBO +ZXh0DQogICBDb25uZWN0aW9uSWRlbnRpZmllciA9IG1fQ29ubmVjdGlvbklkZW50 +aWZpZXINCkVuZCBQcm9wZXJ0eQ0KDQpQdWJsaWMgUHJvcGVydHkgTGV0IENvbm5l +Y3Rpb25JZGVudGlmaWVyKEJ5VmFsIENvbm5lY3Rpb25JZGVudGlmaWVyVG9Vc2Ug +QXMgU3RyaW5nKQ0KT24gRXJyb3IgUmVzdW1lIE5leHQNCiAgIA0KICAgQ2xlYXJD +b25uZWN0aW9uSW5mbw0KICAgbV9Db25uZWN0aW9uSWRlbnRpZmllciA9IENvbm5l +Y3Rpb25JZGVudGlmaWVyVG9Vc2UNCiAgIA0KICAgSWYgTGVuKG1fQ29ubmVjdGlv +bklkZW50aWZpZXIpID4gMCBUaGVuDQogICAgICBMb2FkQ29ubmVjdGlvbkRhdGEg +UmFpc2VEYm1zQ29ubmVjdGlvbkNoYW5nZWRFdmVudDo9VHJ1ZQ0KICAgRWxzZQ0K +ICAgICAgUmFpc2VFdmVudCBEYm1zQ29ubmVjdGlvbkNoYW5nZWQodmJOdWxsU3Ry +aW5nKQ0KICAgRW5kIElmDQogICANCkVuZCBQcm9wZXJ0eQ0KDQpQdWJsaWMgUHJv +cGVydHkgR2V0IENJRCgpIEFzIFN0cmluZw0KICAgU3RvcCAnRGVwcmVjYXRlZDog +dXNlIENvbm5lY3Rpb25JZGVudGlmaWVyDQogICBDSUQgPSBDb25uZWN0aW9uSWRl +bnRpZmllcg0KRW5kIFByb3BlcnR5DQoNClB1YmxpYyBQcm9wZXJ0eSBMZXQgQ0lE +KEJ5VmFsIFNlbGVjdENJRCBBcyBTdHJpbmcpDQogICBTdG9wICdEZXByZWNhdGVk +OiB1c2UgQ29ubmVjdGlvbklkZW50aWZpZXINCiAgIENvbm5lY3Rpb25JZGVudGlm +aWVyID0gU2VsZWN0Q0lEDQpFbmQgUHJvcGVydHkNCg0KDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonUHJvcGVydHk6IERibXNOYW1l +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQon +IE5hbWUgb2YgREJNUyAoTVNKRVQsIE1TU1FMLCBNeVNRTCwgT1JBQ0xFLCBPREJD +KQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +UHVibGljIFByb3BlcnR5IEdldCBEYm1zTmFtZSgpIEFzIFN0cmluZw0KT24gRXJy +b3IgUmVzdW1lIE5leHQNCiAgIElmIFN0clB0cihtX0RCTVNOQU1FKSA9IDAgVGhl +bg0KICAgICAgTG9hZENvbm5lY3Rpb25EYXRhDQogICBFbmQgSWYNCiAgIERibXNO +YW1lID0gbV9EQk1TTkFNRQ0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCidQcm9wZXJ0eTogRGJTZXJ2ZXIN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicg +TmFtZSBvZiBEYXRhYmFzZSBTZXJ2ZXINCicNCicgUmVtYXJrczoNCicgICAgIElu +Y2wuIGluc3RhbmNlIG9mIFNRTCBTZXJ2ZXIgJiBjby4NCicNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBH +ZXQgRGJTZXJ2ZXIoKSBBcyBTdHJpbmcNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQog +ICBEYlNlcnZlciA9IG1fREJTRVJWRVINCkVuZCBQcm9wZXJ0eQ0KDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonUHJvcGVydHk6IERi +TmFtZQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +Jw0KJyBOYW1lIG9mIERhdGFiYXNlDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJvcGVydHkgR2V0IERiTmFtZSgp +IEFzIFN0cmluZw0KT24gRXJyb3IgUmVzdW1lIE5leHQNCiAgIERiTmFtZSA9IG1f +REJOQU1FDQpFbmQgUHJvcGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogRGF0YWJhc2VGaWxlDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEZpbGUg +bmFtZSBpbmNsLiBwYXRoIG9mIGEgZmlsZS1iYXNlZCBiYWNrZW5kDQonDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJv +cGVydHkgR2V0IERhdGFiYXNlRmlsZSgpIEFzIFN0cmluZw0KDQogICBJZiBMZW4o +bV9EYXRhYmFzZUZpbGUpID0gMCBUaGVuDQogICAgICBTZXRDb25uZWN0aW9uU3Ry +aW5ncw0KICAgRW5kIElmDQogICBEYXRhYmFzZUZpbGUgPSBtX0RhdGFiYXNlRmls +ZQ0KDQpFbmQgUHJvcGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogVXNlTG9naW5Gb3JtDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIFNldHRpbmcg +ZnJvbSB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIHdoZXRoZXIgdG8gdXNlIHRo +ZSBsb2dpbiBmb3JtIHdoZW4gbG9nZ2luZyBpbi4NCicNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQg +VXNlTG9naW5Gb3JtKCkgQXMgQm9vbGVhbg0KDQogICBJZiBOb3QgbV9EYm1zSW5m +b1JlYWRlZCBUaGVuDQogICAgICBTZXRDb25uZWN0aW9uU3RyaW5ncw0KICAgRW5k +IElmDQogICBVc2VMb2dpbkZvcm0gPSBtX1VzZUxvZ2luRm9ybQ0KDQpFbmQgUHJv +cGVydHkNCg0KDQojSWYgQ09ORklHX1VTRUxPR0lORk9STSA9IDEgVGhlbg0KDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonUHJvcGVy +dHk6IExvZ2luRm9ybQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KJw0KJyBGb3JtIHJlZmVyZW5jZSB0byBMb2dpbkZvcm0NCicNCict +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQ +cm9wZXJ0eSBHZXQgTG9naW5Gb3JtKCkgQXMgRm9ybQ0KT24gRXJyb3IgUmVzdW1l +IE5leHQNCiAgIFNldCBMb2dpbkZvcm0gPSBtX0xvZ2luRm9ybQ0KRW5kIFByb3Bl +cnR5DQoNClB1YmxpYyBQcm9wZXJ0eSBTZXQgTG9naW5Gb3JtKEJ5VmFsIE5ld1Jl +ZiBBcyBGb3JtKQ0KT24gRXJyb3IgUmVzdW1lIE5leHQNCiAgIFNldCBtX0xvZ2lu +Rm9ybSA9IE5ld1JlZg0KRW5kIFByb3BlcnR5DQoNClByaXZhdGUgU3ViIG1fTG9n +aW5Gb3JtX0NhbmNlbGxlZCgpDQoNCiAgIFJhaXNlRXZlbnQgRGJtc0luZm9NZXNz +YWdlKG1fREJNU05BTUUsICJMb2dpbiB3YXMgY2FuY2VsZWQiLCB2YkV4Y2xhbWF0 +aW9uKQ0KICAgU2V0IG1fTG9naW5Gb3JtID0gTm90aGluZw0KICAgQ2xlYXJDb25u +ZWN0aW9uSW5mbw0KICAgbV9Mb2dpbkNhbmNlbGxlZCA9IFRydWUNCg0KRW5kIFN1 +Yg0KDQpQcml2YXRlIFN1YiBtX0xvZ2luRm9ybV9Mb2dvbihCeVZhbCBMb2dpbk5h +bWUgQXMgU3RyaW5nLCBCeVZhbCBQYXNzd29yZCBBcyBTdHJpbmcsIENhbmNlbCBB +cyBCb29sZWFuKQ0KICAgDQogICBEaW0gRXJyTXNnIEFzIFN0cmluZw0KDQogICBt +X0xvZ2luQ2FuY2VsbGVkID0gRmFsc2UNCiAgIG1fREJVU0VSID0gTG9naW5OYW1l +DQogICBtX0RCVVNFUlBXRCA9IFBhc3N3b3JkDQogICANCiAgIENhbGwgU2V0Q29u +bmVjdGlvblN0cmluZ3MoRmFsc2UpDQogICANCiAgIElmIENoZWNrQWRvQ29ubmVj +dGlvbihtX09sZWRiQ29ubmVjdGlvblN0cmluZywgRXJyTXNnKSA9IEZhbHNlIFRo +ZW4NCiAgICAgIElmIExlbihFcnJNc2cpID4gMCBUaGVuIEVyck1zZyA9IHZiTmV3 +TGluZSAmIHZiTmV3TGluZSAmIEVyck1zZw0KICAgICAgTXNnQm94ICJWZXJiaW5k +dW5nIGtvbm50ZSBuaWNodCBoZXJnZXN0ZWxsdCB3ZXJkZW4iICYgRXJyTXNnDQog +ICAgICBtX0xvZ2luQ2FuY2VsbGVkID0gVHJ1ZQ0KICAgICAgQ2FuY2VsID0gVHJ1 +ZQ0KICAgICAgRXhpdCBTdWINCiAgIEVuZCBJZg0KDQogICBJZiBMZW4obV9EQlVT +RVIpID4gMCBUaGVuDQogICAgICBDdXJyZW50RGIuRXhlY3V0ZSAiVVBEQVRFIChz +ZWxlY3QgKiBmcm9tIHVzeXNfRGJtc0Nvbm5lY3Rpb24gV0hFUkUgREJNUz0nIiAm +IG1fREJNU05BTUUgJiAiJykgU0VUIGRibXNVc2VyID0gJyIgJiBtX0RCVVNFUiAm +ICInIiAnIHRoYW5rcyB0byBNU0ZUIChodHRwczovL3N1cHBvcnQub2ZmaWNlLmNv +bS9lbi11cy9hcnRpY2xlL2FjY2Vzcy1lcnJvci1xdWVyeS1pcy1jb3JydXB0LWZh +ZDIwNWE1LTlmZDQtNDlmMS1iZTgzLWYyMTYzNmNhZWRlYykNCiAgICAgIFNhdmVV +c2VyTmFtZVRvQ29uZmlnRmlsZSBtX0RCVVNFUg0KICAgRW5kIElmDQoNCiAgIFNl +dCBtX0xvZ2luRm9ybSA9IE5vdGhpbmcNCg0KRW5kIFN1Yg0KDQojRW5kIElmDQoN +ClByaXZhdGUgU3ViIFNldENvbm5lY3Rpb25TdHJpbmdzKE9wdGlvbmFsIEJ5VmFs +IGJXaXRoQ29ubmVjdGlvbkNoZWNrIEFzIEJvb2xlYW4gPSBUcnVlKQ0KDQogICBE +aW0gbXlDb25uZWN0aW9uU3RyaW5ncyBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MN +CiAgIERpbSBFcnJNc2cgQXMgU3RyaW5nDQoNCiAgIElmIE5vdCBtX0RibXNJbmZv +UmVhZGVkIFRoZW4NCiAgICAgIExvYWRDb25uZWN0aW9uRGF0YQ0KICAgICAgSWYg +bV9Mb2dpbkNhbmNlbGxlZCBPciAoKExlbihtX0RCU0VSVkVSKSArIExlbihtX0RC +TkFNRSkpID0gMCkgVGhlbg0KICAgICAgICAgRXhpdCBTdWINCiAgICAgIEVuZCBJ +Zg0KICAgRWxzZUlmIG1fTG9naW5DYW5jZWxsZWQgVGhlbg0KICAgICAgRXhpdCBT +dWINCiAgIEVuZCBJZg0KICAgDQogICBJZiBtX0NPTk5FQ1RJT05NT0RFID0gRGJt +c0Nvbm5lY3Rpb25Nb2Rlcy5EQk1TX1VTRVJERUYgVGhlbg0KICAgICAgJ3VzZXIt +ZGVmaW5lZCBzdHJpbmcgPT4gbm8gZGV0ZXJtaW5hdGlvbiB2aWEgZGJtcyBjbGFz +cyByZXF1aXJlZA0KICAgICAgRXhpdCBTdWINCiAgIEVuZCBJZg0KICAgDQogICBt +eUNvbm5lY3Rpb25TdHJpbmdzID0gTWUuQ29ubmVjdGlvblN0cmluZ3MNCg0KICAg +bV9PbGVkYkNvbm5lY3Rpb25TdHJpbmcgPSBteUNvbm5lY3Rpb25TdHJpbmdzLk9s +ZWRiQ29ubmVjdGlvblN0cmluZw0KICAgbV9PZGJjQ29ubmVjdGlvblN0cmluZyA9 +IG15Q29ubmVjdGlvblN0cmluZ3MuT2RiY0Nvbm5lY3Rpb25TdHJpbmcNCiAgIG1f +RGF0YWJhc2VGaWxlID0gbXlDb25uZWN0aW9uU3RyaW5ncy5EYXRhYmFzZUZpbGUN +CiAgIA0KICAgSWYgYldpdGhDb25uZWN0aW9uQ2hlY2sgVGhlbg0KICAgSWYgQ2hl +Y2tDb25uZWN0aW9uKEVyck1zZykgPSBGYWxzZSBUaGVuDQogICAgICBJZiBMZW4o +RXJyTXNnKSA+IDAgVGhlbiBFcnJNc2cgPSB2Yk5ld0xpbmUgJiB2Yk5ld0xpbmUg +JiBFcnJNc2cNCiAgICAgIE1zZ0JveCAiQ29ubmVjdGlvbiBjb3VsZCBub3QgYmUg +ZXN0YWJsaXNoZWQiICYgRXJyTXNnLCB2YkV4Y2xhbWF0aW9uDQogICAgICBDbGVh +ckNvbm5lY3Rpb25JbmZvDQogICBFbmQgSWYNCiAgIEVuZCBJZg0KDQpFbmQgU3Vi +DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +UHJvcGVydHk6IERiVXNlcg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJw0KJyBOYW1lIGRlcyBEYXRlbmJhbmtiZW51dHplcnMNCicN +CicgUGFyYW1ldGVyczoNCicgICAgIFdpdGhvdXRTZXJ2ZXJDaGVjayAgIC0gIFRy +dWUgPSBEbyBub3QgY2hlY2sgd2hldGhlciBjb25uZWN0aW9uIGRhdGEgaGFzIGFs +cmVhZHkgYmVlbiByZWFkIGluLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBEYlVzZXIoT3B0 +aW9uYWwgQnlWYWwgV2l0aG91dFNlcnZlckNoZWNrIEFzIEJvb2xlYW4gPSBGYWxz +ZSkgQXMgU3RyaW5nDQoNCiAgIElmIE5vdCBXaXRob3V0U2VydmVyQ2hlY2sgVGhl +bg0KICAgSWYgTm90IG1fRGJtc0luZm9SZWFkZWQgVGhlbg0KICAgICAgU2V0Q29u +bmVjdGlvblN0cmluZ3MNCiAgIEVuZCBJZg0KICAgRW5kIElmDQogICANCiAgIElm +IG1fVFJVU1RFRENPTk5FQ1RJT04gVGhlbg0KICAgICAgRGJVc2VyID0gR2V0RGJV +c2VyTmFtZQ0KICAgRWxzZQ0KICAgICAgRGJVc2VyID0gbV9EQlVTRVINCiAgIEVu +ZCBJZg0KDQpFbmQgUHJvcGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogRGJVc2VyUGFzc3dvcmQNCict +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgUGFz +c3dvcmQgb2YgdGhlIGRhdGFiYXNlIHVzZXINCicNCicgUmVtYXJrczoNCicgICAg +IFRoZSBwYXNzd29yZCBzaG91bGQgbm9ybWFsbHkgbmV2ZXIgbmVlZCB0byBiZSBy +ZXF1ZXN0ZWQgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIHNoYXJpbmcgd2l0 +aGluIHRoZSBjbGFzcyBzdHJ1Y3R1cmUuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQcml2YXRlIFByb3BlcnR5IEdldCBEYlVz +ZXJQYXNzd29yZCgpIEFzIFN0cmluZw0KDQogICBJZiBOb3QgbV9EYm1zSW5mb1Jl +YWRlZCBUaGVuDQogICAgICBTZXRDb25uZWN0aW9uU3RyaW5ncw0KICAgRW5kIElm +DQogICBEYlVzZXJQYXNzd29yZCA9IG1fREJVU0VSUFdEDQogDQpFbmQgUHJvcGVy +dHkNCg0KRnJpZW5kIFByb3BlcnR5IExldCBEYlVzZXJQYXNzd29yZChCeVZhbCBO +ZXdWYWx1ZSBBcyBTdHJpbmcpDQoNCiAgIG1fREJVU0VSUFdEID0gTmV3VmFsdWUN +CiANCkVuZCBQcm9wZXJ0eQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonIFByb3BlcnR5OiBTYXZlUGFzc3dvcmQNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgU2V0dGluZyBm +cm9tIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMgd2hldGhlciBwYXNzd29yZCBz +aG91bGQgYmUgc2F2ZWQgZm9yIGxpbmtlZCB0YWJsZXMNCicNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBH +ZXQgU2F2ZVBhc3N3b3JkKCkgQXMgQm9vbGVhbg0KDQogICBJZiBOb3QgbV9EYm1z +SW5mb1JlYWRlZCBUaGVuDQogICAgICBTZXRDb25uZWN0aW9uU3RyaW5ncw0KICAg +RW5kIElmDQogICBTYXZlUGFzc3dvcmQgPSBtX1NBVkVQV0QNCg0KRW5kIFByb3Bl +cnR5DQoNCicjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMNCicNCicgR3JvdXA6IERCTVMgQ29ubmVjdGlvbg0KJw0KDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFByb3Bl +cnR5OiBDb25uZWN0aW9uU3RyaW5ncw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBPREJDIGFuZCBPTEVEQiBDb25uZWN0aW9u +c3RyaW5nDQonDQonIFJldHVybnM6DQonICAgICA8ZGF0YS5kZWZEYkNvbm5lY3Rp +b246OkRibXNDb25uZWN0aW9uU3RyaW5ncz4NCicNCicgUmVtYXJrczoNCicgICAg +IFRoaXMgcHJvY2VkdXJlIG11c3QgYmUgZXh0ZW5kZWQgaWYgb3RoZXIgREJNU3Mg +KHN1Y2ggYXMgT3JhY2xlKSBhcmUgdG8gYmUgdXNlZC4NCicNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCkZyaWVuZCBQcm9wZXJ0eSBH +ZXQgQ29ubmVjdGlvblN0cmluZ3MoKSBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MN +Cg0KICAgSWYgbV9EYm1zSW5mb1JlYWRlZCA9IEZhbHNlIFRoZW4NCiAgICAgIExv +YWRDb25uZWN0aW9uRGF0YQ0KICAgRW5kIElmDQoNCiAgIFNlbGVjdCBDYXNlIG1f +REJNU05BTUUNCiAgICAgIENhc2UgbV9EQk1TTkFNRV9NU1NRTA0KICAgICAgICAg +Q29ubmVjdGlvblN0cmluZ3MgPSBDb25uZWN0aW9uU3RyaW5nc19NU1NRTA0KICAg +ICAgQ2FzZSBtX0RCTVNOQU1FX01TSkVUDQogICAgICAgICBDb25uZWN0aW9uU3Ry +aW5ncyA9IENvbm5lY3Rpb25TdHJpbmdzX01TSkVUDQogICAgICBDYXNlIG1fREJN +U05BTUVfTVlTUUwNCiAgICAgICAgIENvbm5lY3Rpb25TdHJpbmdzID0gQ29ubmVj +dGlvblN0cmluZ3NfTXlTUUwNCiAgICAgIENhc2UgbV9EQk1TTkFNRV9PUkFDTEUN +CiAgICAgICAgIENvbm5lY3Rpb25TdHJpbmdzID0gQ29ubmVjdGlvblN0cmluZ3Nf +T1JBQ0xFDQogICAgICBDYXNlIG1fREJNU05BTUVfT0RCQw0KICAgICAgICAgQ29u +bmVjdGlvblN0cmluZ3MgPSBDb25uZWN0aW9uU3RyaW5nc19PREJDDQogICAgICBD +YXNlIEVsc2UNCiAgICAgICAgIEVyci5SYWlzZSBEYkNvbm5lY3Rpb25JbmZvRXJy +b3JOdW1iZXJzLkVSUk5SX05PREJNUywgIkNvbm5lY3Rpb25TdHJpbmdzIiwgIkNv +bm5lY3Rpb24gc3RyaW5ncyBjYW5ub3QgYmUgY3JlYXRlZCBmb3IgJyIgJiBtX0RC +TVNOQU1FICYgIicuIChTZWxlY3Rpb24gbm90IHBvc3NpYmxlLikiDQogICBFbmQg +U2VsZWN0DQoNCkVuZCBQcm9wZXJ0eQ0KDQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IE9sZWRiQ29ubmVjdGlv +blN0cmluZw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJw0KJyBPbGVkYkNvbm5lY3Rpb25TdHJpbmcNCicNCicgUmV0dXJuczoNCicg +ICAgIFN0cmluZw0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KRnJpZW5kIFByb3BlcnR5IEdldCBPbGVkYkNvbm5lY3Rpb25TdHJp +bmcoKSBBcyBTdHJpbmcNCg0KICAgSWYgTGVuKG1fT2xlZGJDb25uZWN0aW9uU3Ry +aW5nKSA9IDAgVGhlbg0KICAgICAgU2V0Q29ubmVjdGlvblN0cmluZ3MNCiAgIEVu +ZCBJZg0KICAgT2xlZGJDb25uZWN0aW9uU3RyaW5nID0gbV9PbGVkYkNvbm5lY3Rp +b25TdHJpbmcNCiAgIA0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IE9kYmNDb25uZWN0 +aW9uU3RyaW5nDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIE9kYmNDb25uZWN0aW9uU3RyaW5nDQonDQonIFBhcmFtZXRlcnM6 +DQonICAgICBXaXRob3V0VXNlckluZm8gLSBGYWxzZSA9IHVzZXIgSUQgaW5jbC4g +cGFzc3dvcmQgaXMgY29udGFpbmVkIGluIHRoZSBPREJDIGNvbm5lY3Rpb24gc3Ry +aW5nLA0KJyAgICAgICAgICAgICAgICAgICAgICAgVHJ1ZSA9IHdpdGhvdXQgdXNl +ciBkYXRhDQonDQonIFJldHVybnM6DQonICAgICBTdHJpbmcNCicNCicgUmVtYXJr +czoNCicgICAgIFNldHRpbmcgdGhlIHBhcmFtZXRlciBXaXRob3V0VXNlckluZm8g +aXMgbm9ybWFsbHkgbm90IG5lY2Vzc2FyeSwNCicgICAgIGJ1dCBjYW4gYmUgaGVs +cGZ1bCBpZiB0aGUgT0RCQyBjb25uZWN0aW9uIHN0cmluZyBpcyByZXF1aXJlZCB3 +aXRob3V0IGEgcGFzc3dvcmQuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQpGcmllbmQgUHJvcGVydHkgR2V0IE9kYmNDb25uZWN0 +aW9uU3RyaW5nKE9wdGlvbmFsIEJ5VmFsIFdpdGhvdXRVc2VySW5mbyBBcyBCb29s +ZWFuID0gRmFsc2UpIEFzIFN0cmluZw0KDQogICBJZiBMZW4obV9PZGJjQ29ubmVj +dGlvblN0cmluZykgPSAwIFRoZW4NCiAgICAgIFNldENvbm5lY3Rpb25TdHJpbmdz +DQogICBFbmQgSWYNCiAgIElmIFdpdGhvdXRVc2VySW5mbyBUaGVuDQogICAgICBP +ZGJjQ29ubmVjdGlvblN0cmluZyA9IFJlcGxhY2UobV9PZGJjQ29ubmVjdGlvblN0 +cmluZywgR2V0T2RiY1VzZXJJbmZvKCksICIiKQ0KICAgRWxzZQ0KICAgICAgT2Ri +Y0Nvbm5lY3Rpb25TdHJpbmcgPSBtX09kYmNDb25uZWN0aW9uU3RyaW5nDQogICBF +bmQgSWYNCg0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IENoZWNrQ29ubmVjdGlvbg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBD +aGVjayBjb25uZWN0aW9uIHRvIHNlcnZlciBhbmQgZGF0YWJhc2UNCicNCicgUGFy +YW1ldGVyczoNCicgICAgIEVyck1zZyAgICAgIC0gRXJyb3IgbWVzc2FnZSBmcm9t +IEFET0RCIG9yIE9EQkMgY29ubmVjdGlvbg0KJw0KJyBSZXR1cm5zOg0KJyAgICAg +Qm9vbGVhbiAgICAgLSBUcnVlID0gQWRvLSBhbmQgT0RCQy1jb25uZWN0aW9uIGNv +dWxkIGJlIGVzdGFibGlzaGVkDQonDQonIFJlbWFya3M6DQonICAgICBUaGUgZmly +c3QgdGVzdCBpcyB0byBlc3RhYmxpc2ggdGhlIEFETyBjb25uZWN0aW9uLg0KJyAg +ICAgQXMgc29vbiBhcyB0aGlzIGlzIHN1Y2Nlc3NmdWwsIHRoZSBPREJDIGNvbm5l +Y3Rpb24gaXMgdGVzdGVkLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIENoZWNrQ29ubmVjdGlvbihP +cHRpb25hbCBCeVJlZiBFcnJNc2cgQXMgU3RyaW5nID0gdmJOdWxsU3RyaW5nKSBB +cyBCb29sZWFuDQogICANCiAgIERpbSBjaGVja09rIEFzIEJvb2xlYW4NCg0KICAg +Y2hlY2tPayA9IENoZWNrQWRvQ29ubmVjdGlvbihPbGVkYkNvbm5lY3Rpb25TdHJp +bmcsIEVyck1zZykNCiAgIElmIGNoZWNrT2sgVGhlbiAnIHRlc3QgT0RCQyB0ZXN0 +ZW4gKGlmIEFETyBjb25uZWN0aW9uIGRvbid0IGZhaWxlZCkNCiAgICAgIElmIG1f +REJNU05BTUUgPD4gIk1TSkVUIiBUaGVuDQogICAgICAgICBjaGVja09rID0gY2hl +Y2tPayBBbmQgQ2hlY2tPZGJjQ29ubmVjdGlvbihPZGJjQ29ubmVjdGlvblN0cmlu +ZywgRXJyTXNnKQ0KICAgICAgRW5kIElmDQogICBFbmQgSWYNCiAgIA0KICAgQ2hl +Y2tDb25uZWN0aW9uID0gY2hlY2tPaw0KDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0 +ZSBGdW5jdGlvbiBDaGVja0Fkb0Nvbm5lY3Rpb24oQnlWYWwgc09sZURiQ29ubmVj +dGlvbnN0cmluZyBBcyBTdHJpbmcsIEJ5UmVmIE1zZyBBcyBTdHJpbmcpIEFzIEJv +b2xlYW4NCg0KICAgRGltIGNubiBBcyBPYmplY3QgJ0FET0RCLkNvbm5lY3Rpb24N +CiAgIERpbSBpIEFzIExvbmcNCg0KICAgSWYgTGVuKHNPbGVEYkNvbm5lY3Rpb25z +dHJpbmcpID0gMCBUaGVuDQogICAgICBDaGVja0Fkb0Nvbm5lY3Rpb24gPSBGYWxz +ZQ0KICAgICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIFNldCBj +bm4gPSBDcmVhdGVPYmplY3QoIkFET0RCLkNvbm5lY3Rpb24iKQ0KICAgV2l0aCBj +bm4NCiAgICAgIC5Db25uZWN0aW9uU3RyaW5nID0gc09sZURiQ29ubmVjdGlvbnN0 +cmluZw0KICAgICAgLkNvbm5lY3Rpb25UaW1lb3V0ID0gbV9DaGVja0Nvbm5lY3Rp +b25UaW1lb3V0U2Vjb25kcw0KICAgICAgDQpPbiBFcnJvciBSZXN1bWUgTmV4dA0K +ICAgICAgLk9wZW4NCiAgICAgIElmIEVyci5OdW1iZXIgPD4gMCBUaGVuDQogICAg +ICAgICBNc2cgPSBNc2cgJiAiVXJzYWNoZSAoT0xFREIpOiINCiAgICAgICAgIEZv +ciBpID0gMCBUbyBjbm4uRXJyb3JzLkNvdW50IC0gMQ0KICAgICAgICAgICAgTXNn +ID0gTXNnICYgdmJOZXdMaW5lICYgY25uLkVycm9ycyhpKS5EZXNjcmlwdGlvbg0K +ICAgICAgICAgTmV4dA0KICAgICAgICAgY25uLkVycm9ycy5DbGVhcg0KICAgICAg +ICAgRXJyLkNsZWFyDQogICAgICAgICBDaGVja0Fkb0Nvbm5lY3Rpb24gPSBGYWxz +ZQ0KICAgICAgICAgRXhpdCBGdW5jdGlvbg0KICAgICAgRW5kIElmDQogICAgICAN +CiAgICAgIElmIC5TdGF0ZSA9IGFkU3RhdGVPcGVuIFRoZW4NCiAgICAgICAgIC5D +bG9zZQ0KICAgICAgICAgQ2hlY2tBZG9Db25uZWN0aW9uID0gVHJ1ZQ0KICAgICAg +RWxzZQ0KICAgICAgICAgQ2hlY2tBZG9Db25uZWN0aW9uID0gRmFsc2UNCiAgICAg +IEVuZCBJZg0KICAgRW5kIFdpdGgNCiAgIFNldCBjbm4gPSBOb3RoaW5nDQoNCkVu +ZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0aW9uIENoZWNrT2RiY0Nvbm5lY3Rp +b24oQnlWYWwgc09kYmNDb25uZWN0aW9uc3RyaW5nIEFzIFN0cmluZywgQnlSZWYg +TXNnIEFzIFN0cmluZykgQXMgQm9vbGVhbg0KDQogICBEaW0gZGIgQXMgREFPLkRh +dGFiYXNlDQogICBEaW0gY2hlY2tPayBBcyBCb29sZWFuDQogICBEaW0gaSBBcyBM +b25nDQoNCiAgIElmIExlbihzT2RiY0Nvbm5lY3Rpb25zdHJpbmcpID0gMCBUaGVu +DQogICAgICBDaGVja09kYmNDb25uZWN0aW9uID0gRmFsc2UNCiAgICAgIEV4aXQg +RnVuY3Rpb24NCiAgIEVuZCBJZg0KICAgDQpPbiBFcnJvciBSZXN1bWUgTmV4dA0K +DQogICBTZXQgZGIgPSBEQkVuZ2luZS5PcGVuRGF0YWJhc2UoIiIsIGRiRHJpdmVy +Q29tcGxldGUsIFRydWUsIHNPZGJjQ29ubmVjdGlvbnN0cmluZykNCiAgIElmIEVy +ci5OdW1iZXIgPD4gMCBUaGVuDQogICAgICBNc2cgPSBNc2cgJiAiVXJzYWNoZSAo +T0RCQyk6Ig0KICAgICAgRm9yIGkgPSAwIFRvIERCRW5naW5lLkVycm9ycy5Db3Vu +dCAtIDENCiAgICAgICAgIE1zZyA9IE1zZyAmIHZiTmV3TGluZSAmIERCRW5naW5l +LkVycm9ycyhpKS5EZXNjcmlwdGlvbg0KICAgICAgTmV4dA0KICAgICAgRXJyLkNs +ZWFyDQogICAgICBjaGVja09rID0gRmFsc2UNCiAgIEVsc2UNCiAgICAgIGNoZWNr +T2sgPSBUcnVlDQogICAgICBkYi5DbG9zZQ0KICAgRW5kIElmDQogICBTZXQgZGIg +PSBOb3RoaW5nDQogICANCiAgIENoZWNrT2RiY0Nvbm5lY3Rpb24gPSBjaGVja09r +DQoNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonIFN1YjogQ2xlYXJDb25uZWN0aW9uSW5mbw0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBEZWxldGUg +c2V0IGNvbm5lY3Rpb24gcGFyYW1ldGVycw0KJw0KJyBSZW1hcmtzOg0KJyAgICAg +UmVxdWlyZXMgcmUtcmVhZGluZyBmcm9tIHRhYmxlIHdoZW4gY29ubmVjdGlvbiBk +YXRhIGlzIHJlcXVlc3RlZC4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NClB1YmxpYyBTdWIgQ2xlYXJDb25uZWN0aW9uSW5mbygp +DQoNCiAgIERpbSBib2xSYWlzZUV2ZW50IEFzIEJvb2xlYW4NCg0KT24gRXJyb3Ig +UmVzdW1lIE5leHQNCg0KICAgYm9sUmFpc2VFdmVudCA9IChMZW4obV9EQk1TTkFN +RSAmIG1fT2xlZGJDb25uZWN0aW9uU3RyaW5nICYgbV9PZGJjQ29ubmVjdGlvblN0 +cmluZykgPiAwKQ0KICAgDQogICBtX0RCTVNOQU1FID0gdmJOdWxsU3RyaW5nDQog +ICBtX09sZWRiQ29ubmVjdGlvblN0cmluZyA9IHZiTnVsbFN0cmluZw0KICAgbV9P +ZGJjQ29ubmVjdGlvblN0cmluZyA9IHZiTnVsbFN0cmluZw0KICAgbV9EYXRhYmFz +ZUZpbGUgPSB2Yk51bGxTdHJpbmcNCiAgIG1fREJPTEVEQlBST1ZJREVSID0gdmJO +dWxsU3RyaW5nDQogICBtX0RCT0RCQ0RSSVZFUiA9IHZiTnVsbFN0cmluZw0KICAg +bV9EQlNFUlZFUiA9IHZiTnVsbFN0cmluZw0KICAgbV9QT1JUID0gdmJOdWxsU3Ry +aW5nDQogICBtX0RCTkFNRSA9IHZiTnVsbFN0cmluZw0KICAgbV9EQlVTRVIgPSB2 +Yk51bGxTdHJpbmcNCiAgIG1fREJVU0VSUFdEID0gdmJOdWxsU3RyaW5nDQogICBt +X0RCT1BUSU9OU19PREJDID0gdmJOdWxsU3RyaW5nDQogICBtX0RCT1BUSU9OU19P +TEVEQiA9IHZiTnVsbFN0cmluZw0KICAgbV9UUlVTVEVEQ09OTkVDVElPTiA9IEZh +bHNlDQogICBtX1VzZUxvZ2luRm9ybSA9IEZhbHNlDQogICBtX0xvZ2luQ2FuY2Vs +bGVkID0gRmFsc2UNCiAgIG1fRGJtc0luZm9SZWFkZWQgPSBGYWxzZQ0KICAgDQog +ICBJZiBib2xSYWlzZUV2ZW50IFRoZW4NCiAgICAgIFJhaXNlRXZlbnQgRGJtc0Nv +bm5lY3Rpb25JbmZvQ2xlYXJlZA0KICAgRW5kIElmDQogICANCkVuZCBTdWINCg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5j +dGlvbjogQ2hhbmdlRGJVc2VyUGFzc3dvcmQNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRGF0ZW5iYW5rcGFzc3dvcnQgZGVz +IEJlbnV0emVycyDkbmRlcm4NCicNCicgUGFyYW1ldGVyczoNCicgICAgIE5ld1Bh +c3N3b3JkIC0gTmV3IHBhc3N3b3J0DQonICAgICBPbGRQYXNzd29yZCAtIG9sZCBw +YXNzd29ydA0KJyAgICAgTG9naW5OYW1lICAgLSBMb2dpbiBuYW1lIChJZiBubyBs +b2dpbiBuYW1lIGlzIHBhc3NlZCwgdGhlIGN1cnJlbnQgbG9naW4gbmFtZSBpcyB1 +c2VkKS4NCicgICAgIE1zZyAgICAgICAgIC0gQnlSZWYgcGFyYW1ldGVyIHRvIHJl +dHVybiBhbiBlcnJvciBtZXNzYWdlIGlmIHRoZSBwYXNzd29yZCBjb3VsZCBub3Qg +YmUgY2hhbmdlZA0KJw0KJyBSZXR1cm5zOg0KJyAgICAgQm9vbGVhbiAgICAgLSBU +cnVlID0gUGFzc3dvcmQgaGFzIGJlZW4gY2hhbmdlZA0KJw0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIENo +YW5nZURiVXNlclBhc3N3b3JkKCBfDQogICAgICAgICAgICAgICBCeVZhbCBOZXdQ +YXNzd29yZCBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgIEJ5VmFsIE9sZFBh +c3N3b3JkIEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlW +YWwgTG9naW5OYW1lIEFzIFN0cmluZyA9IHZiTnVsbFN0cmluZywgXw0KICAgICAg +ICAgICAgICAgT3B0aW9uYWwgQnlSZWYgTXNnIEFzIFN0cmluZykgQXMgQm9vbGVh +bg0KICAgDQogICBEaW0gYm9sUHdkQ2hhbmdlZCBBcyBCb29sZWFuDQogICBEaW0g +c3RyU1FMIEFzIFN0cmluZw0KICAgRGltIHN0ckxvZ2luTmFtZSBBcyBTdHJpbmcN +CiAgIERpbSBjbm4gQXMgQURPREIuQ29ubmVjdGlvbg0KDQogICBTZXQgY25uID0g +TmV3IEFET0RCLkNvbm5lY3Rpb24NCiAgIGNubi5PcGVuIE9sZWRiQ29ubmVjdGlv +blN0cmluZw0KICAgDQogICBJZiBMZW4oTG9naW5OYW1lKSA+IDAgVGhlbg0KICAg +ICAgc3RyTG9naW5OYW1lID0gTG9naW5OYW1lDQogICBFbHNlDQogICAgICBzdHJM +b2dpbk5hbWUgPSBtX0RCVVNFUg0KICAgRW5kIElmDQoNCiAgIHN0clNRTCA9ICJB +TFRFUiBMT0dJTiAiICYgc3RyTG9naW5OYW1lICYgIiBXSVRIIFBBU1NXT1JEID0g +JyIgJiBOZXdQYXNzd29yZCAmICInIg0KICAgDQogICBJZiBMZW4oT2xkUGFzc3dv +cmQpID4gMCBUaGVuDQogICAgICBzdHJTUUwgPSBzdHJTUUwgJiAiIE9MRF9QQVNT +V09SRCA9ICciICYgT2xkUGFzc3dvcmQgJiAiJyINCiAgIEVuZCBJZg0KICAgDQog +ICBPbiBFcnJvciBSZXN1bWUgTmV4dA0KICAgV2l0aCBjbm4NCiAgICAgIC5FcnJv +cnMuQ2xlYXINCiAgICAgIC5FeGVjdXRlIHN0clNRTA0KICAgICAgSWYgLkVycm9y +cy5Db3VudCA+IDAgVGhlbg0KICAgICAgICAgYm9sUHdkQ2hhbmdlZCA9IEZhbHNl +DQogICAgICAgICBNc2cgPSAuRXJyb3JzKDApLkRlc2NyaXB0aW9uDQogICAgICAg +ICAuRXJyb3JzLkNsZWFyDQogICAgICBFbHNlDQogICAgICAgICBib2xQd2RDaGFu +Z2VkID0gVHJ1ZQ0KICAgICAgRW5kIElmDQogICAgICAuQ2xvc2UNCiAgIEVuZCBX +aXRoDQogICBTZXQgY25uID0gTm90aGluZw0KICAgDQogICBJZiBib2xQd2RDaGFu +Z2VkIFRoZW4NCiAgIA0KICAgICAgSWYgc3RyTG9naW5OYW1lID0gbV9EQlVTRVIg +VGhlbg0KICAgICAgICAgbV9EQlVTRVJQV0QgPSBOZXdQYXNzd29yZA0KICAgICAg +ICAgU2V0Q29ubmVjdGlvblN0cmluZ3MNCiAgICAgICAgIFJhaXNlRXZlbnQgUGFz +c3dvcmRDaGFuZ2VkDQogICAgICBFbmQgSWYNCiAgICAgIA0KICAgRW5kIElmDQog +ICANCiAgIENoYW5nZURiVXNlclBhc3N3b3JkID0gYm9sUHdkQ2hhbmdlZA0KDQpF +bmQgRnVuY3Rpb24NCg0KJyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +Iw0KJw0KJyBHcm91cDogRE1CUyBzcGVjaWZpYw0KJw0KDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFByb3BlcnR5OiBQZXJtYW5l +bnRCYWNrZW5kUnN0U3FsVGV4dA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJw0KJyBTZWxlY3Qgc3RhdGVtZW50IGZvciBPREJDIHJl +Y29yZHNldCBjb25uZWN0aW9uIHRvIG1haW50YWluIGNvbm5lY3Rpb24NCicNCicg +UmVtYXJrczoNCicgICAgIFRoaXMgcHJvY2VkdXJlIG11c3QgYmUgZXh0ZW5kZWQg +aWYgb3RoZXIgREJNU3MgKHN1Y2ggYXMgT3JhY2xlKSBhcmUgdG8gYmUgdXNlZC4N +CicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1 +YmxpYyBQcm9wZXJ0eSBHZXQgUGVybWFuZW50QmFja2VuZFJzdFNxbFRleHQoKSBB +cyBTdHJpbmcNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQogICBQZXJtYW5lbnRCYWNr +ZW5kUnN0U3FsVGV4dCA9ICJzZWxlY3QgMSINCkVuZCBQcm9wZXJ0eQ0KDQpQcml2 +YXRlIEZ1bmN0aW9uIEdldERiVXNlck5hbWUoKSBBcyBTdHJpbmcNCg0KICAgRGlt +IGNubiBBcyBBRE9EQi5Db25uZWN0aW9uDQogICBEaW0gcnN0IEFzIEFET0RCLlJl +Y29yZHNldA0KICAgRGltIHN0clNRTCBBcyBTdHJpbmcNCg0KICAgU2V0IGNubiA9 +IE5ldyBBRE9EQi5Db25uZWN0aW9uDQogICBjbm4uT3BlbiBNZS5PbGVkYkNvbm5l +Y3Rpb25TdHJpbmcNCg0KICAgU2VsZWN0IENhc2UgbV9EQk1TTkFNRQ0KICAgICAg +Q2FzZSBtX0RCTVNOQU1FX01TU1FMDQogICAgICAgICBzdHJTUUwgPSAic2VsZWN0 +IGN1cnJlbnRfdXNlciINCiAgICAgIENhc2UgbV9EQk1TTkFNRV9NWVNRTA0KICAg +ICAgICAgc3RyU1FMID0gInNlbGVjdCBjdXJyZW50X3VzZXIiDQogICAgICBDYXNl +IG1fREJNU05BTUVfT1JBQ0xFDQogICAgICAgICBzdHJTUUwgPSAic2VsZWN0IHVz +ZXIgZnJvbSBkdWFsIg0KICAgICAgQ2FzZSBFbHNlDQogICAgICAgICBPbiBFcnJv +ciBHb1RvIDANCiAgICAgICAgIEVyci5SYWlzZSBEYkNvbm5lY3Rpb25JbmZvRXJy +b3JOdW1iZXJzLkVSUk5SX05PREJNUywgIkRiQ29ubmVjdGlvbkluZm8uRGJVc2Vy +TmFtZSIsICJGb3IgJyIgJiBtX0RCTVNOQU1FICYgIicgdGhlIFVzZXJOYW1lIGNh +bm5vdCBiZSBkZXRlcm1pbmVkLiAoU2VsZWN0aW9uIG5vdCBwb3NzaWJsZS4pIg0K +ICAgRW5kIFNlbGVjdA0KICAgDQogICBTZXQgcnN0ID0gY25uLkV4ZWN1dGUoc3Ry +U1FMKQ0KICAgDQogICBHZXREYlVzZXJOYW1lID0gTnoocnN0LkZpZWxkcygwKSwg +Ik4vQSIpDQogICByc3QuQ2xvc2UNCiAgIGNubi5DbG9zZQ0KDQpFbmQgRnVuY3Rp +b24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBHZXRPZGJjVXNlckluZm8oT3B0aW9uYWwg +QnlWYWwgc1VJRCBBcyBTdHJpbmcgPSB2Yk51bGxTdHJpbmcsIF8NCiAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIHNQV0QgQXMg +U3RyaW5nID0gdmJOdWxsU3RyaW5nKSBBcyBTdHJpbmcNCiAgIA0KICAgSWYgTGVu +KHNVSUQpID0gMCBUaGVuDQogICAgICBJZiBtX0RibXNJbmZvUmVhZGVkID0gRmFs +c2UgVGhlbg0KICAgICAgICAgTG9hZENvbm5lY3Rpb25EYXRhDQogICAgICBFbmQg +SWYNCiAgICAgIHNVSUQgPSBtX0RCVVNFUg0KICAgICAgc1BXRCA9IG1fREJVU0VS +UFdEDQogICBFbmQgSWYNCiAgIA0KICAgU2VsZWN0IENhc2UgbV9EQk1TTkFNRQ0K +ICAgICAgQ2FzZSBtX0RCTVNOQU1FX01TU1FMDQogICAgICAgICBHZXRPZGJjVXNl +ckluZm8gPSBnZXRPZGJjVXNlckluZm9fTVNTUUwoc1VJRCwgc1BXRCkNCiAgICAg +IENhc2UgbV9EQk1TTkFNRV9NWVNRTA0KICAgICAgICAgR2V0T2RiY1VzZXJJbmZv +ID0gZ2V0T2RiY1VzZXJJbmZvX015U1FMKHNVSUQsIHNQV0QpDQogICAgICBDYXNl +IG1fREJNU05BTUVfT1JBQ0xFDQogICAgICAgICBHZXRPZGJjVXNlckluZm8gPSBn +ZXRPZGJjVXNlckluZm9fT1JBQ0xFKHNVSUQsIHNQV0QpDQogICAgICBDYXNlIEVs +c2UNCiAgICAgICAgIE9uIEVycm9yIEdvVG8gMA0KICAgICAgICAgRXJyLlJhaXNl +IERiQ29ubmVjdGlvbkluZm9FcnJvck51bWJlcnMuRVJSTlJfTk9EQk1TLCAiRGJD +b25uZWN0aW9uSW5mby5nZXRPZGJjVXNlckluZm8iLCAiTm8gT2RiY1VzZXJJbmZv +IGNhbiBiZSBjcmVhdGVkIGZvciAnIiAmIG1fREJNU05BTUUgJiAiJy4gKFNlbGVj +dGlvbiBub3QgcG9zc2libGUuKSINCiAgIEVuZCBTZWxlY3QNCg0KRW5kIEZ1bmN0 +aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gQ29ubmVjdGlvblN0cmluZ3NfTVNKRVQo +KSBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MNCg0KICAgRGltIHRlbXBDb25uZWN0 +aW9uU3RyaW5ncyBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MNCiAgIERpbSBzdHJP +REJDIEFzIFN0cmluZywgc3RyT0xFREIgQXMgU3RyaW5nDQogICBEaW0gc3RyRGJG +aWxlIEFzIFN0cmluZw0KDQogICBzdHJEYkZpbGUgPSBtX0RCTkFNRQ0KDQogICBJ +ZiBMZW4obV9EQk9QVElPTlNfT0xFREIpID4gMCBUaGVuDQogICAgICBzdHJPTEVE +QiA9IHN0ck9MRURCICYgIjsiICYgbV9EQk9QVElPTlNfT0xFREINCiAgIEVuZCBJ +Zg0KICAgSWYgTGVuKG1fREJPUFRJT05TX09EQkMpID4gMCBUaGVuDQogICAgICBz +dHJPREJDID0gc3RyT0RCQyAmICI7IiAmIG1fREJPUFRJT05TX09EQkMNCiAgIEVu +ZCBJZg0KDQogICBJZiBMZW4obV9EQk9MRURCUFJPVklERVIpID0gMCBUaGVuDQog +ICAgICBtX0RCT0xFREJQUk9WSURFUiA9IEN1cnJlbnRQcm9qZWN0LkNvbm5lY3Rp +b24uUHJvdmlkZXINCiAgIEVuZCBJZg0KDQogICBzdHJPTEVEQiA9ICJQcm92aWRl +cj0iICYgbV9EQk9MRURCUFJPVklERVIgJiAiO0RhdGEgU291cmNlPSIgJiBzdHJE +YkZpbGUgJiAiO01vZGU9U2hhcmUgRGVueSBOb25lOyIgJiBzdHJPTEVEQg0KDQog +ICBzdHJPREJDID0gIjtEQVRBQkFTRT0iICYgc3RyRGJGaWxlICYgc3RyT0RCQw0K +ICAgDQogICB0ZW1wQ29ubmVjdGlvblN0cmluZ3MuT2xlZGJDb25uZWN0aW9uU3Ry +aW5nID0gc3RyT0xFREINCiAgIHRlbXBDb25uZWN0aW9uU3RyaW5ncy5PZGJjQ29u +bmVjdGlvblN0cmluZyA9IHN0ck9EQkMNCiAgIHRlbXBDb25uZWN0aW9uU3RyaW5n +cy5EYXRhYmFzZUZpbGUgPSBzdHJEYkZpbGUNCiAgIA0KICAgQ29ubmVjdGlvblN0 +cmluZ3NfTVNKRVQgPSB0ZW1wQ29ubmVjdGlvblN0cmluZ3MNCg0KRW5kIEZ1bmN0 +aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gQ29ubmVjdGlvblN0cmluZ3NfTVNTUUwo +KSBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MNCg0KICAgRGltIHRlbXBDb25uZWN0 +aW9uU3RyaW5ncyBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MNCiAgIERpbSBzdHJP +REJDIEFzIFN0cmluZywgc3RyT0xFREIgQXMgU3RyaW5nDQogICBEaW0gc3RyU3J2 +Q29uIEFzIFN0cmluZw0KDQogICBzdHJTcnZDb24gPSBtX0RCU0VSVkVSDQogICBJ +ZiBMZW4obV9QT1JUKSA+IDAgVGhlbg0KICAgICAgc3RyU3J2Q29uID0gc3RyU3J2 +Q29uICYgIiwiICYgbV9QT1JUDQogICBFbmQgSWYNCiAgIA0KICAgSWYgbV9UUlVT +VEVEQ09OTkVDVElPTiBUaGVuDQogICAgICBzdHJPREJDID0gIjtUcnVzdGVkX0Nv +bm5lY3Rpb249WWVzIg0KICAgICAgc3RyT0xFREIgPSAiO0ludGVncmF0ZWQgU2Vj +dXJpdHkgPSBTU1BJIg0KICAgRWxzZUlmIExlbihtX0RCVVNFUikgPiAwIFRoZW4g +J1ZlcmJpbmR1bmcgbWl0IFVzZXIgKyBQd2QNCiAgICAgIHN0ck9EQkMgPSAiO1Ry +dXN0ZWRfQ29ubmVjdGlvbj1ObzsiICYgZ2V0T2RiY1VzZXJJbmZvX01TU1FMKG1f +REJVU0VSLCBtX0RCVVNFUlBXRCkNCiAgICAgIHN0ck9MRURCID0gIjtVc2VyIElE +PSIgJiBtX0RCVVNFUiAmICI7UGFzc3dvcmQ9IiIiICYgbV9EQlVTRVJQV0QgJiAi +IiIiDQogICBFbmQgSWYNCg0KICAgSWYgTGVuKG1fREJPUFRJT05TX09MRURCKSA+ +IDAgVGhlbg0KICAgICAgc3RyT0xFREIgPSBzdHJPTEVEQiAmICI7IiAmIG1fREJP +UFRJT05TX09MRURCDQogICBFbmQgSWYNCiAgIElmIExlbihtX0RCT1BUSU9OU19P +REJDKSA+IDAgVGhlbg0KICAgICAgc3RyT0RCQyA9IHN0ck9EQkMgJiAiOyIgJiBt +X0RCT1BUSU9OU19PREJDDQogICBFbmQgSWYNCg0KICAgSWYgTGVuKG1fREJPTEVE +QlBST1ZJREVSKSA9IDAgVGhlbg0KICAgICAgbV9EQk9MRURCUFJPVklERVIgPSAi +U1FMT0xFREIiDQogICBFbmQgSWYNCg0KICAgc3RyT0xFREIgPSAiUHJvdmlkZXI9 +IiAmIG1fREJPTEVEQlBST1ZJREVSICYgIjtEYXRhIFNvdXJjZT0iICYgc3RyU3J2 +Q29uICYgIjtJbml0aWFsIENhdGFsb2c9IiAmIG1fREJOQU1FICYgc3RyT0xFREIN +CiAgICdzdHJPTEVEQiA9IEdldERhdGFQcm92aWRlck9sZWRiU3RyaW5nKHN0ck9M +RURCKQ0KDQogICBJZiBMZW4obV9EU04pID4gMCBUaGVuDQogICAgICBzdHJPREJD +ID0gIkRTTj0iICYgbV9EU04gJiBzdHJPREJDDQogICBFbHNlDQogICAgICBJZiBM +ZW4obV9EQk9EQkNEUklWRVIpID0gMCBUaGVuDQogICAgICAgIG1fREJPREJDRFJJ +VkVSID0gIlNRTCBTZXJ2ZXIiDQogICAgICBFbmQgSWYNCiAgICAgIHN0ck9EQkMg +PSAiRFJJVkVSPXsiICYgbV9EQk9EQkNEUklWRVIgJiAifTtEQVRBQkFTRT0iICYg +bV9EQk5BTUUgJiAiO1NFUlZFUj0iICYgc3RyU3J2Q29uICYgc3RyT0RCQw0KICAg +RW5kIElmDQogICANCiAgIHRlbXBDb25uZWN0aW9uU3RyaW5ncy5PbGVkYkNvbm5l +Y3Rpb25TdHJpbmcgPSBzdHJPTEVEQg0KICAgdGVtcENvbm5lY3Rpb25TdHJpbmdz +Lk9kYmNDb25uZWN0aW9uU3RyaW5nID0gIk9EQkM7IiAmIHN0ck9EQkMNCiAgIA0K +ICAgQ29ubmVjdGlvblN0cmluZ3NfTVNTUUwgPSB0ZW1wQ29ubmVjdGlvblN0cmlu +Z3MNCg0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gR2V0RGF0YVBy +b3ZpZGVyT2xlZGJTdHJpbmcoQnlWYWwgQmFzZU9sZWRiU3RyaW5nIEFzIFN0cmlu +ZykgQXMgU3RyaW5nDQonUHJvdmlkZXI9TWljcm9zb2Z0LkFjY2Vzcy5PTEVEQi4x +MC4wO0RhdGEgUHJvdmlkZXI9U1FMT0xFREINCiAgIA0KICAgR2V0RGF0YVByb3Zp +ZGVyT2xlZGJTdHJpbmcgPSBSZXBsYWNlKEJhc2VPbGVkYlN0cmluZywgIlByb3Zp +ZGVyPSIsICJQcm92aWRlcj1NaWNyb3NvZnQuQWNjZXNzLk9MRURCLjEwLjA7RGF0 +YSBQcm92aWRlcj0iKQ0KDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlv +biBnZXRPZGJjVXNlckluZm9fTVNTUUwoc1VJRCBBcyBTdHJpbmcsIHNQV0QgQXMg +U3RyaW5nKSBBcyBTdHJpbmcNCk9uIEVycm9yIEdvVG8gMA0KICAgZ2V0T2RiY1Vz +ZXJJbmZvX01TU1FMID0gIlVJRD0iICYgc1VJRCAmICI7UFdEPXsiICYgc1BXRCAm +ICJ9Ig0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gQ29ubmVjdGlv +blN0cmluZ3NfTXlTUUwoKSBBcyBEYm1zQ29ubmVjdGlvblN0cmluZ3MNCg0KICAg +RGltIHRlbXBDb25uZWN0aW9uU3RyaW5ncyBBcyBEYm1zQ29ubmVjdGlvblN0cmlu +Z3MNCiAgIERpbSBzdHJPREJDIEFzIFN0cmluZw0KICAgRGltIHN0clNydkNvbiBB +cyBTdHJpbmcNCg0KICAgSWYgbV9UUlVTVEVEQ09OTkVDVElPTiBUaGVuICdIb3cg +d291bGQgdGhpcyB3b3JrIHdpdGggTXlTUUw/DQogICAgICBtX1RSVVNURURDT05O +RUNUSU9OID0gRmFsc2UNCiAgICAgIElmIFNldExvZ2luRGF0YSBUaGVuDQogICAg +ICAgICBzdHJPREJDID0gZ2V0T2RiY1VzZXJJbmZvX015U1FMKG1fREJVU0VSLCBt +X0RCVVNFUlBXRCkgJiAiOyINCiAgICAgIEVsc2UNCiAgICAgICAgIE9uIEVycm9y +IEdvVG8gMA0KICAgICAgICAgRXJyLlJhaXNlIEVSUk5SX0lOQUNUSVZFLCAiQ29u +bmVjdGlvblN0cmluZ3NfTXlTUUwiLCAiVGhlIFdpbmRvd3MgdXNlciB3YXMgbm90 +IHJlbGVhc2VkIGZvciB0aGUgZGF0YWJhc2UhIg0KICAgICAgRW5kIElmDQogICBF +bHNlICdWZXJiaW5kdW5nIG1pdCBVc2VyICsgUHdkDQogICAgICBzdHJPREJDID0g +Z2V0T2RiY1VzZXJJbmZvX015U1FMKG1fREJVU0VSLCBtX0RCVVNFUlBXRCkgJiAi +OyINCiAgIEVuZCBJZg0KDQogICBzdHJTcnZDb24gPSBtX0RCU0VSVkVSDQogICBJ +ZiBMZW4obV9QT1JUKSA+IDAgVGhlbg0KICAgICBzdHJTcnZDb24gPSBzdHJTcnZD +b24gJiAiO1BPUlQ9IiAmIG1fUE9SVA0KICAgRW5kIElmDQoNCiAgIElmIExlbiht +X0RCT1BUSU9OU19PREJDKSA+IDAgVGhlbg0KICAgICBzdHJPREJDID0gc3RyT0RC +QyAmIG1fREJPUFRJT05TX09EQkMgJiAiOyINCiAgIEVuZCBJZg0KICAgDQogICBJ +ZiBMZW4obV9EU04pID4gMCBUaGVuDQogICAgICBzdHJPREJDID0gIkRTTj0iICYg +bV9EU04gJiAiOyIgJiBzdHJPREJDDQogICBFbHNlDQogICAgICBJZiBMZW4obV9E +Qk9EQkNEUklWRVIpID0gMCBUaGVuDQogICAgICAgIG1fREJPREJDRFJJVkVSID0g +Ik15U1FMIE9EQkMgNS4xIERyaXZlciINCiAgICAgIEVuZCBJZg0KICAgICAgc3Ry +T0RCQyA9ICJEUklWRVI9eyIgJiBtX0RCT0RCQ0RSSVZFUiAmICJ9O0RBVEFCQVNF +PSIgJiBtX0RCTkFNRSAmICI7U0VSVkVSPSIgJiBzdHJTcnZDb24gJiAiOyIgJiBz +dHJPREJDDQogICBFbmQgSWYNCiAgIA0KICAgdGVtcENvbm5lY3Rpb25TdHJpbmdz +Lk9kYmNDb25uZWN0aW9uU3RyaW5nID0gIk9EQkM7IiAmIHN0ck9EQkMNCiAgIHRl +bXBDb25uZWN0aW9uU3RyaW5ncy5PbGVkYkNvbm5lY3Rpb25TdHJpbmcgPSAiUHJv +dmlkZXI9TVNEQVNRTDsiICYgc3RyT0RCQw0KDQogICBDb25uZWN0aW9uU3RyaW5n +c19NeVNRTCA9IHRlbXBDb25uZWN0aW9uU3RyaW5ncw0KDQpFbmQgRnVuY3Rpb24N +Cg0KUHJpdmF0ZSBGdW5jdGlvbiBnZXRPZGJjVXNlckluZm9fTXlTUUwoc1VJRCBB +cyBTdHJpbmcsIHNQV0QgQXMgU3RyaW5nKSBBcyBTdHJpbmcNCk9uIEVycm9yIEdv +VG8gMA0KICAgZ2V0T2RiY1VzZXJJbmZvX015U1FMID0gIlVJRD0iICYgc1VJRCAm +ICI7UFdEPSIgJiBzUFdEDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlv +biBDb25uZWN0aW9uU3RyaW5nc19PUkFDTEUoKSBBcyBEYm1zQ29ubmVjdGlvblN0 +cmluZ3MNCg0KICAgRGltIHRlbXBDb25uZWN0aW9uU3RyaW5ncyBBcyBEYm1zQ29u +bmVjdGlvblN0cmluZ3MNCiAgIERpbSBzdHJPREJDIEFzIFN0cmluZywgc3RyT0xF +REIgQXMgU3RyaW5nDQogICBEaW0gc3RyU3J2Q29uIEFzIFN0cmluZw0KDQogICBJ +ZiBtX1RSVVNURURDT05ORUNUSU9OIFRoZW4gJ0hvdyBkb2VzIHRoaXMgd29yayB3 +aXRoIE9yYWNsZT8NCiAgICAgc3RyT0RCQyA9ICJUcnVzdGVkX0Nvbm5lY3Rpb249 +WWVzOyINCiAgICAgc3RyT0xFREIgPSAiSW50ZWdyYXRlZCBTZWN1cml0eSA9IFNT +UEk7Ig0KICAgRWxzZSAnVmVyYmluZHVuZyBtaXQgVXNlciArIFB3ZA0KICAgICBz +dHJPREJDID0gZ2V0T2RiY1VzZXJJbmZvX09SQUNMRShtX0RCVVNFUiwgbV9EQlVT +RVJQV0QpICYgIjsiDQogICAgIHN0ck9MRURCID0gIlVzZXIgSUQ9IiAmIG1fREJV +U0VSICYgIjtQYXNzd29yZD0iICYgbV9EQlVTRVJQV0QgJiAiOyINCiAgIEVuZCBJ +Zg0KICAgDQogICBJZiBMZW4obV9EQk9QVElPTlNfT0xFREIpID4gMCBUaGVuDQog +ICAgIHN0ck9MRURCID0gc3RyT0xFREIgJiBtX0RCT1BUSU9OU19PTEVEQiAmICI7 +Ig0KICAgRW5kIElmDQogICBJZiBMZW4obV9EQk9QVElPTlNfT0RCQykgPiAwIFRo +ZW4NCiAgICAgc3RyT0RCQyA9IHN0ck9EQkMgJiBtX0RCT1BUSU9OU19PREJDICYg +IjsiDQogICBFbmQgSWYNCiAgIA0KICAgJ01pY3Jvc29mdCBPREJDIGZvciBPcmFj +bGU6DQogICBzdHJTcnZDb24gPSAiKERFU0NSSVBUSU9OPShBRERSRVNTPShDT01N +VU5JVFk9KShQUk9UT0NPTD1UQ1ApKEhvc3Q9IiAmIG1fREJTRVJWRVIgJiAiKShQ +b3J0PSIgJiBtX1BPUlQgJiAiKSkoQ09OTkVDVF9EQVRBPShTSUQ9IiAmIG1fREJO +QU1FICYgIikpKSINCiAgICAgIA0KICAgSWYgTGVuKG1fREJPTEVEQlBST1ZJREVS +KSA9IDAgVGhlbg0KICAgICAgbV9EQk9MRURCUFJPVklERVIgPSAiT3JhT0xFREIu +T3JhY2xlIg0KICAgRW5kIElmDQogICBzdHJPTEVEQiA9ICJQcm92aWRlcj0iICYg +bV9EQk9MRURCUFJPVklERVIgJiAiO0RhdGEgU291cmNlPSIgJiBzdHJTcnZDb24g +JiAiOyIgJiBzdHJPTEVEQg0KDQogICBJZiBMZW4obV9EU04pID4gMCBUaGVuDQog +ICAgICBzdHJPREJDID0gIkRTTj0iICYgbV9EU04gJiAiOyIgJiBzdHJPREJDDQog +ICBFbHNlDQogICAgICBJZiBMZW4obV9EQk9EQkNEUklWRVIpID0gMCBUaGVuDQog +ICAgICAgIG1fREJPREJDRFJJVkVSID0gIk1pY3Jvc29mdCBPREJDIGZvciBPcmFj +bGUiICciT3JhY2xlIGluIE9yYURiMTBnX2hvbWUxIiBvciAiTWljcm9zb2Z0IE9E +QkMgZm9yIE9yYWNsZSINCiAgICAgIEVuZCBJZg0KICAgICAgc3RyT0RCQyA9ICJE +UklWRVI9eyIgJiBtX0RCT0RCQ0RSSVZFUiAmICJ9O1NFUlZFUj0iICYgc3RyU3J2 +Q29uICYgIjsiICYgc3RyT0RCQw0KICAgRW5kIElmDQogICANCiAgIHRlbXBDb25u +ZWN0aW9uU3RyaW5ncy5PbGVkYkNvbm5lY3Rpb25TdHJpbmcgPSBzdHJPTEVEQg0K +ICAgdGVtcENvbm5lY3Rpb25TdHJpbmdzLk9kYmNDb25uZWN0aW9uU3RyaW5nID0g +Ik9EQkM7IiAmIHN0ck9EQkMNCiAgIA0KICAgQ29ubmVjdGlvblN0cmluZ3NfT1JB +Q0xFID0gdGVtcENvbm5lY3Rpb25TdHJpbmdzDQoNCkVuZCBGdW5jdGlvbg0KDQpQ +cml2YXRlIEZ1bmN0aW9uIGdldE9kYmNVc2VySW5mb19PUkFDTEUoc1VJRCBBcyBT +dHJpbmcsIHNQV0QgQXMgU3RyaW5nKSBBcyBTdHJpbmcNCk9uIEVycm9yIEdvVG8g +MA0KICAgZ2V0T2RiY1VzZXJJbmZvX09SQUNMRSA9ICJVSUQ9IiAmIHNVSUQgJiAi +O1BXRD0iICYgc1BXRA0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24g +Q29ubmVjdGlvblN0cmluZ3NfT0RCQygpIEFzIERibXNDb25uZWN0aW9uU3RyaW5n +cw0KDQogICBEaW0gdGVtcENvbm5lY3Rpb25TdHJpbmdzIEFzIERibXNDb25uZWN0 +aW9uU3RyaW5ncw0KICAgRGltIHN0ck9EQkMgQXMgU3RyaW5nDQogICBEaW0gc3Ry +U3J2Q29uIEFzIFN0cmluZw0KICAgDQogICBJZiBMZW4obV9EQk9EQkNEUklWRVIp +ID0gMCBUaGVuDQogICAgICBFcnIuUmFpc2UgRGJDb25uZWN0aW9uSW5mb0Vycm9y +TnVtYmVycy5FUlJOUl9OT0NPTkZJRywgIkNvbm5lY3Rpb25TdHJpbmdzX09EQkMi +LCAiTm8gT0RCQyBkcml2ZXIgd2FzIHNwZWNpZmllZCINCiAgIEVuZCBJZg0KDQog +ICBJZiBtX1RSVVNURURDT05ORUNUSU9OIFRoZW4NCiAgICAgc3RyT0RCQyA9ICJU +cnVzdGVkX0Nvbm5lY3Rpb249WWVzOyINCiAgIEVsc2UgJ1ZlcmJpbmR1bmcgbWl0 +IFVzZXIgKyBQd2QNCiAgICAgIHN0ck9EQkMgPSBnZXRPZGJjVXNlckluZm9fT0RC +QyhtX0RCVVNFUiwgbV9EQlVTRVJQV0QpICYgIjsiDQogICBFbmQgSWYNCg0KICAg +c3RyU3J2Q29uID0gbV9EQlNFUlZFUg0KICAgSWYgTGVuKG1fUE9SVCkgPiAwIFRo +ZW4NCiAgICAgc3RyU3J2Q29uID0gc3RyU3J2Q29uICYgIjtQT1JUPSIgJiBtX1BP +UlQNCiAgIEVuZCBJZg0KDQogICBJZiBMZW4obV9EQk9QVElPTlNfT0RCQykgPiAw +IFRoZW4NCiAgICAgc3RyT0RCQyA9IHN0ck9EQkMgJiBtX0RCT1BUSU9OU19PREJD +ICYgIjsiDQogICBFbmQgSWYNCiAgIA0KICAgSWYgTGVuKG1fRFNOKSA+IDAgVGhl +bg0KICAgICAgc3RyT0RCQyA9ICJEU049IiAmIG1fRFNOICYgIjsiICYgc3RyT0RC +Qw0KICAgRWxzZQ0KICAgICAgc3RyT0RCQyA9ICJEUklWRVI9eyIgJiBtX0RCT0RC +Q0RSSVZFUiAmICJ9O0RBVEFCQVNFPSIgJiBtX0RCTkFNRSAmICI7U0VSVkVSPSIg +JiBzdHJTcnZDb24gJiAiOyIgJiBzdHJPREJDDQogICBFbmQgSWYNCiAgIA0KICAg +dGVtcENvbm5lY3Rpb25TdHJpbmdzLk9kYmNDb25uZWN0aW9uU3RyaW5nID0gIk9E +QkM7IiAmIHN0ck9EQkMNCiAgIHRlbXBDb25uZWN0aW9uU3RyaW5ncy5PbGVkYkNv +bm5lY3Rpb25TdHJpbmcgPSAiUHJvdmlkZXI9TVNEQVNRTDsiICYgc3RyT0RCQw0K +ICAgDQogICBDb25uZWN0aW9uU3RyaW5nc19PREJDID0gdGVtcENvbm5lY3Rpb25T +dHJpbmdzDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBnZXRPZGJj +VXNlckluZm9fT0RCQyhzVUlEIEFzIFN0cmluZywgc1BXRCBBcyBTdHJpbmcpIEFz +IFN0cmluZw0KICAgZ2V0T2RiY1VzZXJJbmZvX09EQkMgPSAiVUlEPSIgJiBzVUlE +ICYgIjtQV0Q9IiAmIHNQV0QNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFByb3BlcnR5OiBUYWJsZUxp +c3RTcWxUZXh0DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIFNRTCBzdGF0ZW1lbnQgaW4gdGhlIFNRTCBkaWFsZWN0IG9mIHRo +ZSBEQk1TIHRvIGxpc3QgdGhlIHRhYmxlcyBjb250YWluZWQgaW4gdGhlIERCUy4N +CicNCicgUmVtYXJrczoNCicgICAgIFRoaXMgcHJvY2VkdXJlIG11c3QgYmUgZXh0 +ZW5kZWQgaWYgZnVydGhlciBEQk1TIGFyZSB0byBiZSB1c2VkLg0KJw0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3Bl +cnR5IEdldCBUYWJsZUxpc3RTcWxUZXh0KCkgQXMgU3RyaW5nDQogICANCiAgIFNl +bGVjdCBDYXNlIG1fREJNU05BTUUNCiAgICAgIENhc2UgbV9EQk1TTkFNRV9NU1NR +TA0KICAgICAgICAgVGFibGVMaXN0U3FsVGV4dCA9ICJzZWxlY3QgVC5UQUJMRV9O +QU1FLCBULlRBQkxFX1NDSEVNQSwgY2FzdChULlRBQkxFX1NDSEVNQSArICcuJyAr +IFQuVEFCTEVfTkFNRSBhcyB2YXJjaGFyKDI1NSkpIEFTIFRhYktleSBmcm9tIGlu +Zm9ybWF0aW9uX3NjaGVtYS5UQUJMRVMgVCBPcmRlciBCeSBULlRBQkxFX05BTUUs +IFQuVEFCTEVfU0NIRU1BIg0KICAgICAgQ2FzZSBtX0RCTVNOQU1FX01ZU1FMDQog +ICAgICAgICBUYWJsZUxpc3RTcWxUZXh0ID0gIlNFTEVDVCBULlRBQkxFX05BTUUs +IE5VTEwgQVMgVEFCTEVfU0NIRU1BLCBULlRBQkxFX05BTUUgQVMgVGFiS2V5IEZS +T00gaW5mb3JtYXRpb25fc2NoZW1hLmBUQUJMRVNgIFQgV0hFUkUgVC5UQUJMRV9T +Q0hFTUE9JyIgJiBEYk5hbWUgJiAiJyBPcmRlciBCeSBULlRBQkxFX05BTUUiDQog +ICAgICBDYXNlIG1fREJNU05BTUVfT1JBQ0xFDQogICAgICAgICBUYWJsZUxpc3RT +cWxUZXh0ID0gIlNFTEVDVCBULlROQU1FIEFTIFRBQkxFX05BTUUsIE5VTEwgQVMg +VEFCTEVfU0NIRU1BLCBULlROQU1FIEFTIFRhYktleSBGUk9NIFRBQiBUIE9yZGVy +IEJ5IFQuVE5BTUUiDQogICAgICBDYXNlIG1fREJNU05BTUVfTVNKRVQNCiAgICAg +ICAgIFRhYmxlTGlzdFNxbFRleHQgPSAic2VsZWN0IFQuTkFNRSBBUyBUQUJMRV9O +QU1FLCBOVUxMIEFTIFRBQkxFX1NDSEVNQSwgVC5OQU1FIEFTIFRhYktleSBmcm9t +IFsiICYgTWUuRGF0YWJhc2VGaWxlICYgIl0uTVN5c09iamVjdHMgVCBXSEVSRSBU +eXBlPTEgQU5EIChULk5hbWUgPCAnTXN5cycgT1IgVC5OYW1lID49ICdNc3l0Jykg +T3JkZXIgQnkgVC5OQU1FIg0KICAgICAgQ2FzZSBtX0RCTVNOQU1FX09EQkMNCiAg +ICAgICAgIFRhYmxlTGlzdFNxbFRleHQgPSB2Yk51bGxTdHJpbmcNCiAgICAgIENh +c2UgdmJOdWxsU3RyaW5nDQogICAgICAgICBUYWJsZUxpc3RTcWxUZXh0ID0gdmJO +dWxsU3RyaW5nDQogICAgICBDYXNlIEVsc2UNCiAgICAgICAgIEVyci5SYWlzZSBE +YkNvbm5lY3Rpb25JbmZvRXJyb3JOdW1iZXJzLkVSUk5SX05PREJNUywgIkRiQ29u +bmVjdGlvbkluZm8uVGFibGVMaXN0U1FMIiwgIkb8ciAnIiAmIG1fREJNU05BTUUg +JiAiJyBr9m5uZW4ga2VpbmUgQ29ubmVjdGlvbnN0cmluZ3MgZXJ6ZXVndCB3ZXJk +ZW4uIChBdXN3YWhsIG5pY2h0IG32Z2xpY2guKSINCiAgIEVuZCBTZWxlY3QNCg0K +RW5kIFByb3BlcnR5DQoNClByaXZhdGUgRnVuY3Rpb24gU2V0TG9naW5EYXRhKCkg +QXMgQm9vbGVhbg0KICAgDQogICBEaW0gY25uIEFzIEFET0RCLkNvbm5lY3Rpb24N +CiAgIERpbSBjbWQgQXMgQURPREIuQ29tbWFuZA0KICAgRGltIHJzdCBBcyBBRE9E +Qi5SZWNvcmRzZXQNCiAgIA0KICAgRGltIHN0cldpbmRvd1VzZXIgQXMgU3RyaW5n +DQoNCiAgIHN0cldpbmRvd1VzZXIgPSBFbnZpcm9uKCJ1c2VybmFtZSIpDQogICAN +CiAgIFNldCBjbm4gPSBOZXcgQURPREIuQ29ubmVjdGlvbg0KICAgY25uLk9wZW4g +Q29ubmVjdGlvblN0cmluZ3NfTXlTUUwuT2xlZGJDb25uZWN0aW9uU3RyaW5nDQog +ICANCiAgIFNldCBjbWQgPSBOZXcgQURPREIuQ29tbWFuZA0KICAgU2V0IGNtZC5B +Y3RpdmVDb25uZWN0aW9uID0gY25uDQogICBjbWQuQ29tbWFuZFRleHQgPSAiR2V0 +TG9naW5EYXRhIg0KICAgY21kLkNvbW1hbmRUeXBlID0gYWRDbWRTdG9yZWRQcm9j +DQogICBjbWQuUGFyYW1ldGVycy5BcHBlbmQgY21kLkNyZWF0ZVBhcmFtZXRlcigi +d2luZG93c3VzZXIiLCBhZFZhckNoYXIsIGFkUGFyYW1JbnB1dCwgMjU1KQ0KICAg +Y21kLlBhcmFtZXRlcnMoMCkgPSBzdHJXaW5kb3dVc2VyDQogICBTZXQgcnN0ID0g +Y21kLkV4ZWN1dGUNCiAgIElmIHJzdC5FT0YgVGhlbg0KICAgICAgbV9EQlVTRVIg +PSBzdHJXaW5kb3dVc2VyDQogICAgICBtX0RCVVNFUlBXRCA9IHZiTnVsbFN0cmlu +Zw0KICAgICAgU2V0TG9naW5EYXRhID0gRmFsc2UNCiAgIEVsc2UNCiAgICAgIG1f +REJVU0VSID0gcnN0LkZpZWxkcygwKQ0KICAgICAgbV9EQlVTRVJQV0QgPSByc3Qu +RmllbGRzKDEpDQogICAgICBTZXRMb2dpbkRhdGEgPSBUcnVlDQogICBFbmQgSWYN +CiAgIA0KICAgcnN0LkNsb3NlDQogICBTZXQgY21kID0gTm90aGluZw0KICAgY25u +LkNsb3NlDQoNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBQYXJzZVRhYmxlTmFtZQ0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBB +dXhpbGlhcnkgcHJvY2VkdXJlIGZvciBhZGp1c3RpbmcgdGhlIHRhYmxlIG5hbWUN +CicNCicgUGFyYW1ldGVyczoNCicgICAgIFRhYmxlTmFtZSAgLSAgVGFibGUgbmFt +ZSB0byBwYXJzZQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgVGFibGUgbmFtZSBmb3Ig +dGhlIHNwZWNpZmljIERCTVMNCicNCicgUmVtYXJrczoNCicgICAgIFdpdGggc29t +ZSBEQk1TLCB0aGUgbmFtZSBtdXN0IGJlIGNhc2Utc2Vuc2l0aXZlIG9yIGJyYWNr +ZXRlZCB3aXRoIHNwZWNpYWwgY2hhcmFjdGVycy4NCicNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBQYXJz +ZVRhYmxlTmFtZShCeVZhbCBUYWJsZU5hbWUgQXMgU3RyaW5nKSBBcyBTdHJpbmcN +CiAgIFNlbGVjdCBDYXNlIG1fREJNU05BTUUNCiAgICAgIENhc2UgbV9EQk1TTkFN +RV9NU0pFVA0KICAgICAgICAgUGFyc2VUYWJsZU5hbWUgPSAiWyIgJiBUYWJsZU5h +bWUgJiAiXSINCiAgICAgIENhc2UgbV9EQk1TTkFNRV9NU1NRTCAnIE5vIGNoYW5n +ZSByZXF1aXJlZCAtIGZvciBzYWZldHksIGVuY2xvc2UgaW4gaW52ZXJ0ZWQgY29t +bWFzIHNvIHRoYXQgdGFibGUgbmFtZXMgd2l0aCBzcGFjZXMgY2FuIGFsc28gYmUg +dXNlZC4NCiAgICAgICAgIFBhcnNlVGFibGVOYW1lID0gIiIiIiAmIFRhYmxlTmFt +ZSAmICIiIiINCiAgICAgIENhc2UgbV9EQk1TTkFNRV9NWVNRTCAnYnJhY2tldCBp +biAiYCIgZm9yIHNhZmV0eS4NCiAgICAgICAgIFBhcnNlVGFibGVOYW1lID0gImAi +ICYgVGFibGVOYW1lICYgImAiDQogICAgICBDYXNlIG1fREJNU05BTUVfT1JBQ0xF +DQogICAgICAgICBQYXJzZVRhYmxlTmFtZSA9ICIiIiIgJiBUYWJsZU5hbWUgJiAi +IiIiDQogICAgICBDYXNlIEVsc2UNCiAgICAgICAgIFBhcnNlVGFibGVOYW1lID0g +VGFibGVOYW1lDQogICBFbmQgU2VsZWN0DQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTog +RGF0ZUZvcm1hdA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KJw0KJyBEQk1TIHNwZWNpZmljIGRhdGUgZm9ybWF0DQonDQonIFJldHVy +bnM6DQonICAgICBGb3JtYXQgc3RyaW5nDQonDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJvcGVydHkgR2V0IERhdGVG +b3JtYXQoKSBBcyBTdHJpbmcNCiAgIFNlbGVjdCBDYXNlIG1fREJNU05BTUUNCiAg +ICAgIENhc2UgbV9EQk1TTkFNRV9NU0pFVA0KICAgICAgICAgRGF0ZUZvcm1hdCA9 +ICJcI3l5eXktbW0tZGQgaGg6bm46c3NcIyINCiAgICAgIENhc2UgbV9EQk1TTkFN +RV9NU1NRTA0KICAgICAgICAgRGF0ZUZvcm1hdCA9ICIneXl5eW1tZGQgaGg6bm46 +c3MnIg0KICAgICAgQ2FzZSBtX0RCTVNOQU1FX01ZU1FMDQogICAgICAgICBEYXRl +Rm9ybWF0ID0gIid5eXl5LW1tLWRkIGhoOm5uOnNzJyINCiAgICAgIENhc2UgbV9E +Qk1TTkFNRV9PUkFDTEUNCiAgICAgICAgIERhdGVGb3JtYXQgPSAiJ3l5eXltbWRk +IGhoOm5uOnNzJyINCiAgICAgIENhc2UgbV9EQk1TTkFNRV9PREJDDQogICAgICAg +ICBEYXRlRm9ybWF0ID0gIid5eXl5bW1kZCBoaDpubjpzcyciDQogICAgICBDYXNl +IEVsc2UNCiAgICAgICAgIEVyci5SYWlzZSBEYkNvbm5lY3Rpb25JbmZvRXJyb3JO +dW1iZXJzLkVSUk5SX05PREJNUywgIkRiQ29ubmVjdGlvbkluZm8uRGF0ZUZvcm1h +dCIsICJG/HIgJyIgJiBtX0RCTVNOQU1FICYgIicga2FubiBrZWluZSBEYXR1bXNm +cm9tYXQgZXJtaXR0ZWx0IHdlcmRlbi4iDQogICBFbmQgU2VsZWN0DQpFbmQgUHJv +cGVydHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJyBQcm9wZXJ0eTogV2lsZENhcmRTdHJpbmcNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgREJNUyBzcGVjaWZpYyB3aWxk +Y2FyZCAobGlrZSAqKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBXaWxkQ2FyZFN0cmluZygp +IEFzIFN0cmluZw0KICAgU2VsZWN0IENhc2UgbV9EQk1TTkFNRQ0KICAgICAgQ2Fz +ZSBtX0RCTVNOQU1FX01TSkVUDQogICAgICAgICBXaWxkQ2FyZFN0cmluZyA9ICIq +Ig0KICAgICAgQ2FzZSBtX0RCTVNOQU1FX01TU1FMDQogICAgICAgICBXaWxkQ2Fy +ZFN0cmluZyA9ICIlIg0KICAgICAgQ2FzZSBtX0RCTVNOQU1FX01ZU1FMDQogICAg +ICAgICBXaWxkQ2FyZFN0cmluZyA9ICIlIg0KICAgICAgQ2FzZSBtX0RCTVNOQU1F +X09SQUNMRQ0KICAgICAgICAgV2lsZENhcmRTdHJpbmcgPSAiJSINCiAgICAgIENh +c2UgbV9EQk1TTkFNRV9PREJDDQogICAgICAgICBXaWxkQ2FyZFN0cmluZyA9ICIl +Ig0KICAgICAgQ2FzZSBFbHNlDQogICAgICAgICBXaWxkQ2FyZFN0cmluZyA9ICIl +Ig0KICAgRW5kIFNlbGVjdA0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IEJvb2xlYW5U +cnVlU3RyaW5nDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIERCTVMgc3BlY2lmaWMgc3RyaW5nIGZvciB0cnVlDQonDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgUHJv +cGVydHkgR2V0IEJvb2xlYW5UcnVlU3RyaW5nKCkgQXMgU3RyaW5nDQogICBTZWxl +Y3QgQ2FzZSBtX0RCTVNOQU1FDQogICAgICBDYXNlIG1fREJNU05BTUVfTVNKRVQN +CiAgICAgICAgIEJvb2xlYW5UcnVlU3RyaW5nID0gIlRydWUiDQogICAgICBDYXNl +IG1fREJNU05BTUVfTVNTUUwNCiAgICAgICAgIEJvb2xlYW5UcnVlU3RyaW5nID0g +IjEiDQogICAgICBDYXNlIG1fREJNU05BTUVfTVlTUUwNCiAgICAgICAgIEJvb2xl +YW5UcnVlU3RyaW5nID0gIjEiDQogICAgICBDYXNlIG1fREJNU05BTUVfT1JBQ0xF +DQogICAgICAgICBCb29sZWFuVHJ1ZVN0cmluZyA9ICIxIg0KICAgICAgQ2FzZSBt +X0RCTVNOQU1FX09EQkMNCiAgICAgICAgIEJvb2xlYW5UcnVlU3RyaW5nID0gIlRy +dWUiDQogICAgICBDYXNlIEVsc2UNCiAgICAgICAgIEVyci5SYWlzZSBEYkNvbm5l +Y3Rpb25JbmZvRXJyb3JOdW1iZXJzLkVSUk5SX05PREJNUywgIkRiQ29ubmVjdGlv +bkluZm8uQm9vbGVhblRydWVTdHJpbmciLCAiRvxyICciICYgbV9EQk1TTkFNRSAm +ICInIGthbm4ga2VpbiBUcnVlLVN0cmluZyBlcm1pdHRlbHQgd2VyZGVuLiINCiAg +IEVuZCBTZWxlY3QNCkVuZCBQcm9wZXJ0eQ0KDQojSWYgQ09ORklHX1VTRUxPR0lO +Rk9STSA9IDEgVGhlbg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KJyBQcm9wZXJ0eTogTG9naW5Gb3JtTmFtZQ0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBOYW1lIG9mIHRoZSBs +b2dpbiBmb3JtDQonDQonIFJlbWFya3M6DQonICAgICBFeGFtcGxlIGZyb20gQUNM +aWI6IHVzZXIvbG9naW4vTG9naW5Gb3JtLmZybQ0KJw0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBM +b2dpbkZvcm1OYW1lKCkgQXMgU3RyaW5nDQogICBJZiBMZW4obV9Mb2dpbkZvcm1O +YW1lKSA9IDAgVGhlbg0KICAgICAgTG9naW5Gb3JtTmFtZSA9IG1fRGVmYXVsdExv +Z2luRm9ybU5hbWUNCiAgIEVsc2UNCiAgICAgIExvZ2luRm9ybU5hbWUgPSBtX0xv +Z2luRm9ybU5hbWUNCiAgIEVuZCBJZg0KRW5kIFByb3BlcnR5DQoNClB1YmxpYyBQ +cm9wZXJ0eSBMZXQgTG9naW5Gb3JtTmFtZShCeVZhbCBOZXdWYWx1ZSBBcyBTdHJp +bmcpDQogICAgbV9Mb2dpbkZvcm1OYW1lID0gTmV3VmFsdWUNCkVuZCBQcm9wZXJ0 +eQ0KDQojRW5kIElmDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicgUHJvcGVydHk6IERibXNDb25maWdGb3JtTmFtZQ0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBOYW1lIG9m +IHRoZSBEQk1TIGNvbmZpZ3VyYXRpb24gZm9ybQ0KJw0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBE +Ym1zQ29uZmlnRm9ybU5hbWUoKSBBcyBTdHJpbmcNCiAgIERibXNDb25maWdGb3Jt +TmFtZSA9IG1fRGJtc0NvbmZpZ0Zvcm1OYW1lDQpFbmQgUHJvcGVydHkNCg0KUHVi +bGljIFByb3BlcnR5IExldCBEYm1zQ29uZmlnRm9ybU5hbWUoQnlWYWwgTmV3VmFs +dWUgQXMgU3RyaW5nKQ0KICAgIG1fRGJtc0NvbmZpZ0Zvcm1OYW1lID0gTmV3VmFs +dWUNCkVuZCBQcm9wZXJ0eQ0KDQoNClByaXZhdGUgU3ViIExvYWRDb25uZWN0aW9u +RGF0YShPcHRpb25hbCBCeVZhbCBXaXRob3V0TG9naW5Gb3JtIEFzIEJvb2xlYW4g +PSBGYWxzZSwgT3B0aW9uYWwgQnlWYWwgUmFpc2VEYm1zQ29ubmVjdGlvbkNoYW5n +ZWRFdmVudCBBcyBCb29sZWFuID0gRmFsc2UpDQogICANCiAgIERpbSB0ZW1wQ29u +bklEIEFzIFN0cmluZw0KDQogICB0ZW1wQ29ubklEID0gbV9Db25uZWN0aW9uSWRl +bnRpZmllcg0KDQogICBDbGVhckNvbm5lY3Rpb25JbmZvDQogICANCiAgIExvYWRD +b25uZWN0aW9uRGF0YUZyb21UYWJsZQ0KICAgDQogICBtX0RibXNJbmZvUmVhZGVk +ID0gVHJ1ZQ0KICAgbV9TQVZFUFdEID0gKExlbihtX0RCVVNFUlBXRCkgPiAwKSBB +bmQgKG1fVXNlTG9naW5Gb3JtID0gRmFsc2UpDQogICANCiAgIElmIG1fREJNU05B +TUUgPSAiTVNKRVQiIFRoZW4NCiAgICAgIG1fRGF0YWJhc2VGaWxlID0gbV9EQk5B +TUUNCiAgIEVuZCBJZg0KDQogICBJZiBOb3QgV2l0aG91dExvZ2luRm9ybSBUaGVu +DQogICBJZiBtX1VzZUxvZ2luRm9ybSBUaGVuICdyZXN1bHRzIGluIGxvZ2luLCB0 +aGVyZWZvcmUgZG8gbm90IHVzZSBmb3IgcHJlLXNldHRpbmdzISAoPT53aXRob3V0 +TG9naW5Gb3JtPXRydWUpDQojSWYgQ09ORklHX1VTRUxPR0lORk9STSA9IDEgVGhl +bg0KICAgICAgRGltIExvZ2luVXNlck5hbWUgQXMgU3RyaW5nDQogICAgICBMb2dp +blVzZXJOYW1lID0gR2V0VXNlck5hbWVGcm9tQ29uZmlnRmlsZQ0KICAgICAgSWYg +TGVuKExvZ2luVXNlck5hbWUpID0gMCBUaGVuDQogICAgICAgICBMb2dpblVzZXJO +YW1lID0gbV9EQlVTRVINCiAgICAgIEVuZCBJZg0KICAgDQogICAgICAnTWFrZSBt +X0xvZ2luRm9ybSBhY2Nlc3NpYmxlIHZpYSBQcm9wZXJ0eSBMb2dpbkZvcm0gYW5k +IHNldCBpdCBpbiB0aGUgTG9naW5Gb3JtIGl0c2VsZjoNCiAgICAgIERvQ21kLk9w +ZW5Gb3JtIExvZ2luRm9ybU5hbWUsIGFjTm9ybWFsLCAsICwgYWNGb3JtRWRpdCwg +YWNEaWFsb2csIE9ialB0cihNZSkgJiAiQCIgJiBtX0Nvbm5lY3Rpb25JZGVudGlm +aWVyICYgIkAiICYgTG9naW5Vc2VyTmFtZQ0KI0Vsc2UNCiAgIEVyci5SYWlzZSB2 +Yk9iamVjdEVycm9yLCAiRGJDb25uZWN0aW9uSW5mbyIsICJDT05GSUdfVVNFTE9H +SU5GT1JNIGluIFByb2pla3RlaWdlbnNjaGFmdGVuIG5pY2h0IGdlc2V0enQhIg0K +I0VuZCBJZg0KICAgRW5kIElmDQogICBFbmQgSWYNCiAgIA0KICAgSWYgKHRlbXBD +b25uSUQgPD4gbV9Db25uZWN0aW9uSWRlbnRpZmllcikgT3IgUmFpc2VEYm1zQ29u +bmVjdGlvbkNoYW5nZWRFdmVudCBUaGVuDQogICAgICBSYWlzZUV2ZW50IERibXND +b25uZWN0aW9uQ2hhbmdlZChtX0Nvbm5lY3Rpb25JZGVudGlmaWVyKQ0KICAgRW5k +IElmDQoNCkVuZCBTdWINCg0KUHJpdmF0ZSBTdWIgTG9hZENvbm5lY3Rpb25EYXRh +RnJvbVRhYmxlKCkNCg0KICAgRGltIHJzdCBBcyBEQU8uUmVjb3Jkc2V0DQogICBE +aW0gU2VsZWN0U3FsIEFzIFN0cmluZw0KICAgRGltIExvYQ0KICAgDQogICBJZiBM +ZW4obV9Db25uZWN0aW9uSWRlbnRpZmllcikgPSAwIFRoZW4gJ1NlbGVjdCB0aGUg +RFMgdGhhdCBoYXMgYmVlbiBtYXJrZWQgYXMgIkFjdGl2ZSIuDQogICAgICBTZWxl +Y3RTcWwgPSBBY3RpdmF0ZWRDb25uRGF0YVNlbGVjdFNxbA0KICAgRWxzZQ0KICAg +ICAgU2VsZWN0U3FsID0gUmVwbGFjZShTZWxlY3RDb25uZWN0aW9uSWRlbnRpZmll +ckNvbm5EYXRhU2VsZWN0U3FsLCAie0Nvbm5lY3Rpb25JZGVudGlmaWVyfSIsIFNx +bFRvb2xzLlRleHRUb1NxbFRleHQobV9Db25uZWN0aW9uSWRlbnRpZmllcikpDQog +ICBFbmQgSWYNCg0KICAgU2V0IHJzdCA9IEN1cnJlbnREYi5PcGVuUmVjb3Jkc2V0 +KFNlbGVjdFNxbCwgZGJPcGVuU25hcHNob3QpDQogICBJZiByc3QuRU9GIFRoZW4N +CiAgICAgIA0KICAgICAgcnN0LkNsb3NlDQogICAgICBTZXQgcnN0ID0gTm90aGlu +Zw0KICAgICAgDQogICAgICBJZiBMZW4obV9Db25uZWN0aW9uSWRlbnRpZmllcikg +PSAwIFRoZW4gJ25vIGNvbm5lY3Rpb24gaGFzIGJlZW4gYWN0aXZhdGVkIHlldA0K +ICAgICAgICAgSWYgTm90IFRyeUdldENvbm5lY3Rpb25EYXRhV2l0aENvbmZpZ0Zv +cm0ocnN0KSBUaGVuDQogICAgICAgICAgICBFcnIuUmFpc2UgRGJDb25uZWN0aW9u +SW5mb0Vycm9yTnVtYmVycy5FUlJOUl9OT0RCTVMsICJEYkNvbm5lY3Rpb25JbmZv +LkxvYWREYm1zQ29ubmVjdGlvbkRhdGFGcm9tVGFibGUiLCAiRXMgd3VyZGUga2Vp +bmUgVmVyYmluZHVuZyBha3RpdmllcnQuIg0KICAgICAgICAgICAgRXhpdCBTdWIN +CiAgICAgICAgIEVsc2VJZiBtX0RibXNJbmZvUmVhZGVkIFRoZW4NCiAgICAgICAg +ICAgIEV4aXQgU3ViDQogICAgICAgICBFbmQgSWYNCiAgICAgIEVsc2UNCiAgICAg +ICAgIEVyci5SYWlzZSBEYkNvbm5lY3Rpb25JbmZvRXJyb3JOdW1iZXJzLkVSUk5S +X05PREJNUywgIkRiQ29ubmVjdGlvbkluZm8uTG9hZERibXNDb25uZWN0aW9uRGF0 +YUZyb21UYWJsZSIsICJLZWluIEVpbnRyYWcgZvxyICciICYgbV9Db25uZWN0aW9u +SWRlbnRpZmllciAmICInIGdlZnVuZGVuIg0KICAgICAgICAgRXhpdCBTdWINCiAg +ICAgIEVuZCBJZg0KICAgICAgDQogICBFbmQgSWYNCiAgIA0KICAgJ1JlYWQgc2V0 +dGluZ3MNCiAgIExvYWRDb25uZWN0aW9uRGF0YUZyb21SZWNvcmRzZXQgcnN0DQog +ICByc3QuQ2xvc2UNCiAgIFNldCByc3QgPSBOb3RoaW5nDQoNCkVuZCBTdWINCg0K +UHJpdmF0ZSBGdW5jdGlvbiBUcnlHZXRDb25uZWN0aW9uRGF0YVdpdGhDb25maWdG +b3JtKEJ5UmVmIHJzdCBBcyBEQU8uUmVjb3Jkc2V0KSBBcyBCb29sZWFuDQoNCiAg +IElmIExlbihEYm1zQ29uZmlnRm9ybU5hbWUpID4gMCBUaGVuDQogICANCiAgICAg +IElmIE1zZ0JveCgiTm8gY29ubmVjdGlvbiBoYXMgYmVlbiBhY3RpdmF0ZWQgeWV0 +LiIgJiB2Yk5ld0xpbmUgJiBfDQogICAgICAgICAgICAgICAgIlBsZWFzZSBjaGVj +ayB0aGUgY29ubmVjdGlvbiBwYXJhbWV0ZXJzIGFuZCBhY3RpdmF0ZSB0aGUgZGVz +aXJlZCBjb25uZWN0aW9uLiIsIF8NCiAgICAgICAgICAgICAgICAgICAgIHZiSW5m +b3JtYXRpb24gKyB2Yk9LQ2FuY2VsKSA9IHZiT0sgVGhlbg0KICAgICAgICAgICAg +ICAgICAgICAgDQogICAgICAgICBEb0NtZC5PcGVuRm9ybSBEYm1zQ29uZmlnRm9y +bU5hbWUsICwgLCAsICwgYWNEaWFsb2cNCiAgICAgICAgICdBYm9ydCwgaWYgYWxy +ZWFkeSBpbml0aWFsaXplZCB2aWEgZm9ybQ0KICAgICAgICAgSWYgbV9EYm1zSW5m +b1JlYWRlZCBUaGVuDQogICAgICAgICAgICBUcnlHZXRDb25uZWN0aW9uRGF0YVdp +dGhDb25maWdGb3JtID0gVHJ1ZQ0KICAgICAgICAgICAgRXhpdCBGdW5jdGlvbg0K +ICAgICAgICAgRW5kIElmDQogICAgICAgICANCiAgICAgIEVuZCBJZg0KICAgICAg +DQogICAgICBTZXQgcnN0ID0gQ3VycmVudERiLk9wZW5SZWNvcmRzZXQoQWN0aXZh +dGVkQ29ubkRhdGFTZWxlY3RTcWwsIGRiT3BlblNuYXBzaG90KQ0KICAgICAgSWYg +Tm90IHJzdC5FT0YgVGhlbg0KICAgICAgICAgbV9Db25uZWN0aW9uSWRlbnRpZmll +ciA9IE56KHJzdC5GaWVsZHMoIkNJRCIpLCB2Yk51bGxTdHJpbmcpDQogICAgICAg +ICBUcnlHZXRDb25uZWN0aW9uRGF0YVdpdGhDb25maWdGb3JtID0gVHJ1ZQ0KICAg +ICAgRWxzZQ0KICAgICAgICAgcnN0LkNsb3NlDQogICAgICAgICBTZXQgcnN0ID0g +Tm90aGluZw0KICAgICAgICAgVHJ5R2V0Q29ubmVjdGlvbkRhdGFXaXRoQ29uZmln +Rm9ybSA9IEZhbHNlDQogICAgICBFbmQgSWYNCiAgICAgIA0KICAgRW5kIElmDQog +ICANCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIFN1YiBMb2FkQ29ubmVjdGlvbkRh +dGFGcm9tUmVjb3Jkc2V0KEJ5VmFsIHJzdCBBcyBEQU8uUmVjb3Jkc2V0KQ0KDQog +ICBXaXRoIHJzdA0KICAgICAgSWYgTGVuKG1fQ29ubmVjdGlvbklkZW50aWZpZXIp +ID0gMCBUaGVuDQogICAgICAgICBtX0Nvbm5lY3Rpb25JZGVudGlmaWVyID0gTnoo +cnN0LkZpZWxkcygiQ0lEIiksIHZiTnVsbFN0cmluZykNCiAgICAgICAgIElmIExl +bihtX0Nvbm5lY3Rpb25JZGVudGlmaWVyKSA9IDAgVGhlbg0KICAgICAgICAgICAg +RXJyLlJhaXNlIERiQ29ubmVjdGlvbkluZm9FcnJvck51bWJlcnMuRVJSTlJfTk9E +Qk1TLCAiRGJDb25uZWN0aW9uSW5mby5yZWFkREJNU3Byb3AiLCAiTm8gY29ubmVj +dGlvbiB3YXMgcGFzc2VkLiINCiAgICAgICAgICAgIEV4aXQgU3ViDQogICAgICAg +ICBFbmQgSWYNCiAgICAgIEVuZCBJZg0KICAgICAgDQogICAgICBtX0RCTVNOQU1F +ID0gTnoocnN0LkZpZWxkcygiREJNUyIpLCB2Yk51bGxTdHJpbmcpDQogICAgICBt +X0NPTk5FQ1RJT05NT0RFID0gTnooLkZpZWxkcygiZGJtc0Nvbm5lY3Rpb25Nb2Rl +IiksIDApICcxID0gRE5TIGxlc3MsIDIgPSBEU04sIDQgPSBjdXN0b20NCiAgIA0K +ICAgICAgbV9EQk5BTUUgPSAuRmllbGRzKCJkYm1zRGF0YWJhc2UiKSAmIHZiTnVs +bFN0cmluZw0KICAgICAgDQogICAgICBtX0RCU0VSVkVSID0gLkZpZWxkcygiZGJt +c1NlcnZlciIpICYgdmJOdWxsU3RyaW5nDQogICAgICBtX1BPUlQgPSAuRmllbGRz +KCJkYm1zUG9ydCIpICYgdmJOdWxsU3RyaW5nDQogICAgICANCiAgICAgIG1fVFJV +U1RFRENPTk5FQ1RJT04gPSBOeiguRmllbGRzKCJkYm1zVXNlVHJ1c3RlZENvbm5l +Y3Rpb24iKSwgRmFsc2UpDQogICAgICBtX1VzZUxvZ2luRm9ybSA9IE56KC5GaWVs +ZHMoImRibXNVc2VMb2dpbkZvcm0iKSwgRmFsc2UpDQogICAgICBtX0RCVVNFUiA9 +IC5GaWVsZHMoImRibXNVc2VyIikgJiB2Yk51bGxTdHJpbmcNCiAgICAgIG1fREJV +U0VSUFdEID0gLkZpZWxkcygiZGJtc1B3ZCIpICYgdmJOdWxsU3RyaW5nDQogICAg +ICANCiAgICAgIElmIE5vdCBtX1RSVVNURURDT05ORUNUSU9OIFRoZW4NCiAgICAg +IA0KICAgICAgICAgJ1RyeSBnZXQgbG9naW4gZGF0YSBieSBFdmVudCAodG8gZ2V0 +IHBhc3N3b3JkIGZyb20gdmJhIGNvZGUpDQogICAgICAgICBJZiBMZW4obV9EQlVT +RVIpID0gMCBPciBMZW4obV9EQlVTRVJQV0QpID0gMCBUaGVuDQogICAgICAgICAg +ICBSYWlzZUV2ZW50IExvZ2luRGF0YVJlcXVpcmVkKG1fREJVU0VSLCBtX0RCVVNF +UlBXRCkNCiAgICAgICAgICAgIElmIG1fVXNlTG9naW5Gb3JtIFRoZW4NCiAgICAg +ICAgICAgICAgIElmIExlbihtX0RCVVNFUikgPiAwIEFuZCBMZW4obV9EQlVTRVJQ +V0QpID4gMCBUaGVuDQogICAgICAgICAgICAgICAgICBtX1VzZUxvZ2luRm9ybSA9 +IEZhbHNlDQogICAgICAgICAgICAgICBFbmQgSWYNCiAgICAgICAgICAgIEVuZCBJ +Zg0KICAgICAgICAgRW5kIElmDQogICAgICAgICANCiAgICAgICAgICdGYWxscyBr +ZWluIE5hbWUgYW5nZWdlYmVuIGlzdCwgTG9naW5mb3JtIGFrdGl2aWVyZW4NCiAg +ICAgICAgIElmIE5vdCAobV9Vc2VMb2dpbkZvcm0gT3IgbV9UUlVTVEVEQ09OTkVD +VElPTikgQW5kIExlbihtX0RCVVNFUikgPSAwIFRoZW4NCiAgICAgICAgICAgIG1f +VXNlTG9naW5Gb3JtID0gKG1fREJNU05BTUUgPD4gIk1TSkVUIikNCiAgICAgICAg +IEVuZCBJZg0KICAgICAgDQogICAgICBFbmQgSWYNCiAgICAgIA0KICAgICAgbV9E +U04gPSAuRmllbGRzKCJkYm1zRFNOIikgJiB2Yk51bGxTdHJpbmcNCiAgICAgIA0K +ICAgICAgbV9EQk9MRURCUFJPVklERVIgPSAuRmllbGRzKCJkYm1zT2xlRGJQcm92 +aWRlciIpICYgdmJOdWxsU3RyaW5nDQogICAgICBtX0RCT1BUSU9OU19PTEVEQiA9 +IC5GaWVsZHMoImRibXNPcHRpb25zT0xFREIiKSAmIHZiTnVsbFN0cmluZw0KICAg +ICAgDQogICAgICBtX0RCT0RCQ0RSSVZFUiA9IC5GaWVsZHMoImRibXNPZGJjRHJp +dmVyIikgJiB2Yk51bGxTdHJpbmcNCiAgICAgIG1fREJPUFRJT05TX09EQkMgPSAu +RmllbGRzKCJkYm1zT3B0aW9uc09EQkMiKSAmIHZiTnVsbFN0cmluZw0KICAgICAg +DQogICAgICBtX09sZWRiQ29ubmVjdGlvblN0cmluZyA9IC5GaWVsZHMoImRibXND +b25TdHJPTEVEQiIpICYgdmJOdWxsU3RyaW5nDQogICAgICBtX09kYmNDb25uZWN0 +aW9uU3RyaW5nID0gLkZpZWxkcygiZGJtc0NvblN0ck9EQkMiKSAmIHZiTnVsbFN0 +cmluZw0KDQogICBFbmQgV2l0aA0KICAgDQpFbmQgU3ViDQoNClByaXZhdGUgRnVu +Y3Rpb24gR2V0VXNlck5hbWVGcm9tQ29uZmlnRmlsZSgpIEFzIFN0cmluZw0KDQog +ICBEaW0gUmV0dXJuU3RyIEFzIFN0cmluZyAqIDEyODANCiAgIERpbSBSZXRWYWwg +QXMgTG9uZw0KICAgDQpPbiBFcnJvciBSZXN1bWUgTmV4dA0KDQogICBSZXRWYWwg +PSBHZXRQcml2YXRlUHJvZmlsZVN0cmluZygiTG9naW4iLCAiVXNlck5hbWUiLCB2 +Yk51bGxTdHJpbmcgJiB2Yk51bGxDaGFyLCBSZXR1cm5TdHIsIExlbihSZXR1cm5T +dHIpLCBDdXJyZW50UHJvamVjdC5QYXRoICYgIlwiICYgbV9Db25uZWN0aW9uSWRl +bnRpZmllciAmICIuaW5pIikNCiAgIEdldFVzZXJOYW1lRnJvbUNvbmZpZ0ZpbGUg +PSBUcmltKExlZnQoUmV0dXJuU3RyLCBSZXRWYWwpKQ0KDQpFbmQgRnVuY3Rpb24N +Cg0KUHJpdmF0ZSBTdWIgU2F2ZVVzZXJOYW1lVG9Db25maWdGaWxlKEJ5VmFsIFVz +ZXJOYW1lIEFzIFN0cmluZykNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQogICBXcml0 +ZVByaXZhdGVQcm9maWxlU3RyaW5nICJMb2dpbiIsICJVc2VyTmFtZSIsIFVzZXJO +YW1lLCBDdXJyZW50UHJvamVjdC5QYXRoICYgIlwiICYgbV9Db25uZWN0aW9uSWRl +bnRpZmllciAmICIuaW5pIg0KRW5kIFN1Yg0K + + 20231011081056 + data/DbConnectionInfo.cls + + + DbConnectionManager + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIkRiQ29ubmVjdGlvbk1hbmFnZXIi +DQpBdHRyaWJ1dGUgVkJfR2xvYmFsTmFtZVNwYWNlID0gRmFsc2UNCkF0dHJpYnV0 +ZSBWQl9DcmVhdGFibGUgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX1ByZWRlY2xhcmVk +SWQgPSBGYWxzZQ0KQXR0cmlidXRlIFZCX0V4cG9zZWQgPSBGYWxzZQ0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBDbGFzczogZGF0 +YS5EYkNvbm5lY3Rpb25NYW5hZ2VyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonDQonIENsYXNzIGZvciBpbnN0YW50aWF0aW9uLCB0 +ZXJtaW5hdGlvbiBhbmQgYmFzaWMgY29udHJvbCBvZiBkYXRhIGFjY2VzcyBjbGFz +c2VzDQonDQonIEF1dGhvcjoNCicgICAgIEpvc2VmIFBvZXR6bA0KJw0KJyBSZW1h +cmtzOg0KJyAgICAgVGhpcyBjbGFzcyByZWFjdHMgdG8gdGhlIGV2ZW50cyBvZiB0 +aGUgPGRhdGEuRGJDb25uZWN0aW9uSW5mbz4gYW5kIDxkYXRhLkRiQ29ubmVjdGlv +bkhhbmRsZXI+IGluc3RhbmNlLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonPGNvZGVsaWI+DQonICA8ZmlsZT5kYXRhL0RiQ29ubmVj +dGlvbk1hbmFnZXIuY2xzPC9maWxlPg0KJyAgPGxpY2Vuc2U+X2NvZGVsaWIvbGlj +ZW5zZS5iYXM8L2xpY2Vuc2U+DQonICA8dXNlPmRhdGEvRGJDb25uZWN0aW9uSW5m +by5jbHM8L3VzZT4NCicgIDx1c2U+ZGF0YS9EYkNvbm5lY3Rpb25IYW5kbGVyLmNs +czwvdXNlPg0KJyAgPHVzZT5kYXRhL0RiQ29ubmVjdGlvblNldHRpbmdzLmNsczwv +dXNlPg0KJyAgPHVzZT5kYXRhL1NxbFRvb2xzLmNsczwvdXNlPg0KJyAgPHJlZj48 +bmFtZT5EQU88L25hbWU+PG1ham9yPjEyPC9tYWpvcj48bWlub3I+MDwvbWlub3I+ +PGd1aWQ+ezRBQzlFMURBLTVCQUQtNEFDNy04NkUzLTI0RjRDRENFQ0EyOH08L2d1 +aWQ+PC9yZWY+DQonPC9jb2RlbGliPg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KT3B0aW9uIENvbXBhcmUgVGV4dA0KT3B0aW9u +IEV4cGxpY2l0DQoNCidDb25uZWN0aW9uIHBhcmFtZXRlcnMNClByaXZhdGUgV2l0 +aEV2ZW50cyBtX0RiQ29ubmVjdGlvbkluZm8gQXMgRGJDb25uZWN0aW9uSW5mbw0K +QXR0cmlidXRlIG1fRGJDb25uZWN0aW9uSW5mby5WQl9WYXJIZWxwSUQgPSAtMQ0K +DQonREIgY29ubmVjdGlvbg0KUHJpdmF0ZSBXaXRoRXZlbnRzIG1fRGJDb25uZWN0 +aW9uIEFzIERiQ29ubmVjdGlvbkhhbmRsZXINCkF0dHJpYnV0ZSBtX0RiQ29ubmVj +dGlvbi5WQl9WYXJIZWxwSUQgPSAtMQ0KDQpQdWJsaWMgRXZlbnQgQmVmb3JlSW5p +dERiQ29ubmVjdGlvbihCeVJlZiBPZGJjQ29ubmVjdGlvblN0cmluZyBBcyBTdHJp +bmcsIEJ5UmVmIE9sZWRiQ29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcsIEJ5UmVm +IFNldHRpbmdzIEFzIERiQ29ubmVjdGlvblNldHRpbmdzKQ0KUHVibGljIEV2ZW50 +IERiQ29ubmVjdGlvbkluaXRpYWxpemVkKCkNCg0KUHJpdmF0ZSBtX0RlZmF1bHRE +YkNvbm5lY2lvblNldHRpbmdzIEFzIERiQ29ubmVjdGlvblNldHRpbmdzDQpQcml2 +YXRlIG1fUGVybWFuZW50QmFja2VuZFJzdCBBcyBEQU8uUmVjb3Jkc2V0DQpQcml2 +YXRlIG1fRGlzcG9zZWQgQXMgQm9vbGVhbg0KDQpQcml2YXRlIG1fRGJtc1VzZXJO +YW1lIEFzIFN0cmluZw0KUHJpdmF0ZSBtX0RibXNVc2VyUGFzc3dvcmQgQXMgU3Ry +aW5nDQoNClByaXZhdGUgU3ViIENsYXNzX1Rlcm1pbmF0ZSgpDQpPbiBFcnJvciBS +ZXN1bWUgTmV4dA0KICAgRGlzcG9zZQ0KRW5kIFN1Yg0KDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFN1YjogRGlzcG9zZQ0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBSZW1v +dmUgb2JqZWN0IHJlZmVyZW5jZXMNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBTdWIgRGlzcG9zZSgpDQoNCk9uIEVy +cm9yIFJlc3VtZSBOZXh0DQogICANCiAgIElmIG1fRGlzcG9zZWQgVGhlbiBFeGl0 +IFN1Yg0KDQogICBEaXNwb3NlUGVybWFuZW50QmFja2VuZFJzdA0KICAgDQogICBT +ZXQgbV9EYkNvbm5lY3Rpb24gPSBOb3RoaW5nDQogICBTZXQgbV9EYkNvbm5lY3Rp +b25JbmZvID0gTm90aGluZw0KDQogICBtX0Rpc3Bvc2VkID0gKDAgPSBFcnIuTnVt +YmVyKQ0KDQpFbmQgU3ViDQoNClB1YmxpYyBTdWIgU2V0VXNlckRhdGEoQnlWYWwg +VXNlck5hbWUgQXMgU3RyaW5nLCBCeVZhbCBQYXNzd29yZCBBcyBTdHJpbmcpDQog +ICBtX0RibXNVc2VyTmFtZSA9IFVzZXJOYW1lDQogICBtX0RibXNVc2VyUGFzc3dv +cmQgPSBQYXNzd29yZA0KRW5kIFN1Yg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBDaGVja0Nvbm5lY3Rpb25T +dGF0dXMNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicNCicgVGVzdCB3aGV0aGVyIGEgY29ubmVjdGlvbiBjYW4gYmUgZXN0YWJsaXNo +ZWQNCicNCicgUmV0dXJuczoNCicgICAgIEJvb2xlYW4gLSBUcnVlIGlmIHN1Y2Nl +c3MNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +ClB1YmxpYyBGdW5jdGlvbiBDaGVja0Nvbm5lY3Rpb25TdGF0dXMoKSBBcyBCb29s +ZWFuDQoNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQoNCiAgIENoZWNrQ29ubmVjdGlv +blN0YXR1cyA9IENvbm5lY3Rpb25JbmZvLkNoZWNrQ29ubmVjdGlvbg0KDQpFbmQg +RnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KJyBQcm9wZXJ0eTogRGVmYXVsdFNldHRpbmdzDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIFRlc3Qgd2hldGhlciBh +IGNvbm5lY3Rpb24gY2FuIGJlIGVzdGFibGlzaGVkDQonDQonIFJldHVybnM6DQon +ICAgICA8ZGF0YS5EYkNvbm5lY3Rpb25TZXR0aW5ncz4NCicNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBH +ZXQgRGVmYXVsdFNldHRpbmdzKCkgQXMgRGJDb25uZWN0aW9uU2V0dGluZ3MNCiAg +IElmIG1fRGVmYXVsdERiQ29ubmVjaW9uU2V0dGluZ3MgSXMgTm90aGluZyBUaGVu +DQogICAgICBTZXQgbV9EZWZhdWx0RGJDb25uZWNpb25TZXR0aW5ncyA9IE5ldyBE +YkNvbm5lY3Rpb25TZXR0aW5ncw0KICAgICAgbV9EZWZhdWx0RGJDb25uZWNpb25T +ZXR0aW5ncy5EZWZhdWx0QWRvZGJDdXJzb3JMb2NhdGlvbiA9IGFkVXNlU2VydmVy +DQogICAgICBtX0RlZmF1bHREYkNvbm5lY2lvblNldHRpbmdzLk9wZW5QZXJtYW5l +bnRCYWNrZW5kUmVjb3Jkc2V0ID0gVHJ1ZQ0KICAgRW5kIElmDQogICBTZXQgRGVm +YXVsdFNldHRpbmdzID0gbV9EZWZhdWx0RGJDb25uZWNpb25TZXR0aW5ncw0KRW5k +IFByb3BlcnR5DQoNClByaXZhdGUgU3ViIERpc3Bvc2VQZXJtYW5lbnRCYWNrZW5k +UnN0KCkNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQogICBJZiBOb3QgKG1fUGVybWFu +ZW50QmFja2VuZFJzdCBJcyBOb3RoaW5nKSBUaGVuDQogICAgICBtX1Blcm1hbmVu +dEJhY2tlbmRSc3QuQ2xvc2UNCiAgICAgIFNldCBtX1Blcm1hbmVudEJhY2tlbmRS +c3QgPSBOb3RoaW5nDQogICBFbmQgSWYNCkVuZCBTdWINCg0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTogQ29ubmVj +dGlvbkluZm8NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NCicNCicgRGJDb25uZWN0aW9uSW5mbyBpbnN0YW5jZQ0KJw0KJyBSZXR1cm5z +Og0KJyAgICAgPGRhdGEuRGJDb25uZWN0aW9uSW5mbz4NCicNCicgUmVtYXJrczoN +CicgICAgIFVzZWQgdG8gb3V0cHV0IGluZm9ybWF0aW9uIG9uIHRoZSBkYXRhYmFz +ZSBjb25uZWN0aW9uDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQpQdWJsaWMgUHJvcGVydHkgR2V0IENvbm5lY3Rpb25JbmZvKCkg +QXMgRGJDb25uZWN0aW9uSW5mbw0KDQogICBJZiBtX0RiQ29ubmVjdGlvbkluZm8g +SXMgTm90aGluZyBUaGVuDQogICAgICBTZXQgbV9EYkNvbm5lY3Rpb25JbmZvID0g +TmV3IERiQ29ubmVjdGlvbkluZm8NCiAgICAgIG1fRGlzcG9zZWQgPSBGYWxzZQ0K +ICAgRW5kIElmDQogICBTZXQgQ29ubmVjdGlvbkluZm8gPSBtX0RiQ29ubmVjdGlv +bkluZm8NCiAgIA0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IERiQ29ubmVjdGlvbg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBE +YkNvbm5lY3Rpb25IYW5kbGVyIGluc3RhbmNlID0gVG9wIGxldmVsIG9mIHRoZSBk +YXRhIGFjY2VzcyBzdHJ1Y3R1cmUNCicNCicgUmV0dXJuczoNCicgICAgIDxkYXRh +LkRiQ29ubmVjdGlvbkhhbmRsZXI+DQonDQonIFJlbWFya3M6DQonICAgICBFbmNh +cHN1bGF0ZXMgQURPREIgYW5kIERBTyBtZXRob2RzIGFzIHdlbGwgYXMgT0RCQyBh +Y2Nlc3Nlcw0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBEYkNvbm5lY3Rpb24oKSBBcyBEYkNv +bm5lY3Rpb25IYW5kbGVyDQoNCiAgIElmIG1fRGJDb25uZWN0aW9uIElzIE5vdGhp +bmcgVGhlbg0KICAgICAgSW5pdERiQ29ubmVjdGlvbg0KICAgRW5kIElmDQogICBT +ZXQgRGJDb25uZWN0aW9uID0gbV9EYkNvbm5lY3Rpb24NCiAgIA0KRW5kIFByb3Bl +cnR5DQoNClByaXZhdGUgU3ViIEluaXREYkNvbm5lY3Rpb24oKQ0KICAgDQogICBE +aW0gT2RiY0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nDQogICBEaW0gT2xlZGJD +b25uZWN0aW9uU3RyaW5nIEFzIFN0cmluZw0KICAgRGltIE5ld1NldHRpbmdzIEFz +IERiQ29ubmVjdGlvblNldHRpbmdzDQogICANCiAgIElmIG1fRGJDb25uZWN0aW9u +IElzIE5vdGhpbmcgVGhlbg0KICAgICAgU2V0IG1fRGJDb25uZWN0aW9uID0gTmV3 +IERiQ29ubmVjdGlvbkhhbmRsZXINCiAgIEVuZCBJZg0KICAgDQogICBTZXQgTmV3 +U2V0dGluZ3MgPSBEZWZhdWx0U2V0dGluZ3MuQ2xvbmUNCiAgIFdpdGggTWUuQ29u +bmVjdGlvbkluZm8NCiAgICAgIE9kYmNDb25uZWN0aW9uU3RyaW5nID0gLk9kYmND +b25uZWN0aW9uU3RyaW5nDQogICAgICBPbGVkYkNvbm5lY3Rpb25TdHJpbmcgPSAu +T2xlZGJDb25uZWN0aW9uU3RyaW5nDQogICAgICBOZXdTZXR0aW5ncy5TcWxEYXRl +Rm9ybWF0ID0gLkRhdGVGb3JtYXQNCiAgICAgIE5ld1NldHRpbmdzLlNxbFdpbGRD +YXJkU3RyaW5nID0gLldpbGRDYXJkU3RyaW5nDQogICAgICBOZXdTZXR0aW5ncy5T +cWxCb29sZWFuVHJ1ZVN0cmluZyA9IC5Cb29sZWFuVHJ1ZVN0cmluZw0KICAgRW5k +IFdpdGgNCiAgIA0KICAgUmFpc2VFdmVudCBCZWZvcmVJbml0RGJDb25uZWN0aW9u +KE9kYmNDb25uZWN0aW9uU3RyaW5nLCBPbGVkYkNvbm5lY3Rpb25TdHJpbmcsIE5l +d1NldHRpbmdzKQ0KICAgDQogICAnIERlZmF1bHRTZXR0aW5ncyB2b24gTmV3U2V0 +dGluZ3Mg/GJlcm5laG1lbjoNCiAgICcgS29waWVyZW4gdW5kIG5pY2h0IFJlZmVy +ZW56IHp1d2Vpc2VuLCBkYW1pdCBEYXRlbiBwYXNzZW4sIGZhbGxzIGFuIGFuZGVy +ZXIgU3RlbGxlIGJlcmVpdHMgZWluZSBSZWZlcmVueiBhdWYgRGVmYXVsdFNldHRp +bmdzIGdlc2V0enQgd3VyZGUNCiAgIERlZmF1bHRTZXR0aW5ncy5Db3B5RnJvbSBO +ZXdTZXR0aW5ncw0KICAgDQogICBTZXQgbV9EYkNvbm5lY3Rpb24uQ3VycmVudERi +ID0gQXBwbGljYXRpb24uQ3VycmVudERiICcgLi4uIG5pY2h0IHVuYmVkaW5ndCBl +cmZvcmRlcmxpY2gsIHdpcmQgYmVpIEJlZGFyZiD8YmVyIEV2ZW50IGFuZ2Vmb3Jk +ZXJ0DQogICBtX0RiQ29ubmVjdGlvbi5PZGJjQ29ubmVjdGlvblN0cmluZyA9IE9k +YmNDb25uZWN0aW9uU3RyaW5nDQogICBtX0RiQ29ubmVjdGlvbi5PbGVkYkNvbm5l +Y3Rpb25TdHJpbmcgPSBPbGVkYkNvbm5lY3Rpb25TdHJpbmcNCiAgIA0KICAgV2l0 +aCBEZWZhdWx0U2V0dGluZ3MNCg0KICAgICAgU3FsVG9vbHMuU3FsRGF0ZUZvcm1h +dCA9IC5TcWxEYXRlRm9ybWF0DQogICAgICBTcWxUb29scy5TcWxXaWxkQ2FyZFN0 +cmluZyA9IC5TcWxXaWxkQ2FyZFN0cmluZw0KICAgICAgU3FsVG9vbHMuU3FsQm9v +bGVhblRydWVTdHJpbmcgPSAuU3FsQm9vbGVhblRydWVTdHJpbmcNCiAgICAgIA0K +ICAgICAgIG1fRGJDb25uZWN0aW9uLkFET0RCLkRlZmF1bHRDdXJzb3JMb2NhdGlv +biA9IC5EZWZhdWx0QWRvZGJDdXJzb3JMb2NhdGlvbg0KICAgICAgDQogICAgICBJ +ZiAuT3BlblBlcm1hbmVudEJhY2tlbmRSZWNvcmRzZXQgVGhlbg0KICAgICAgICAg +T3BlblBlcm1hbmVudEJhY2tlbmRSZWNvcmRzZXQNCiAgICAgIEVuZCBJZg0KICAg +ICAgDQogICBFbmQgV2l0aA0KDQogICBSYWlzZUV2ZW50IERiQ29ubmVjdGlvbklu +aXRpYWxpemVkDQoNCkVuZCBTdWINCg0KUHJpdmF0ZSBTdWIgT3BlblBlcm1hbmVu +dEJhY2tlbmRSZWNvcmRzZXQoKQ0KDQogICBJZiBOb3QgKG1fUGVybWFuZW50QmFj +a2VuZFJzdCBJcyBOb3RoaW5nKSBUaGVuDQogICBPbiBFcnJvciBSZXN1bWUgTmV4 +dA0KICAgICAgbV9QZXJtYW5lbnRCYWNrZW5kUnN0LkNsb3NlDQogICBPbiBFcnJv +ciBHb1RvIDANCiAgICAgIFNldCBtX1Blcm1hbmVudEJhY2tlbmRSc3QgPSBOb3Ro +aW5nDQogICBFbmQgSWYNCiAgIA0KICAgSWYgTGVuKENvbm5lY3Rpb25JbmZvLkRi +bXNOYW1lKSA9IDAgVGhlbg0KICAgICAgRXhpdCBTdWINCiAgIEVuZCBJZg0KICAg +DQogICBJZiBMZW4oTWUuQ29ubmVjdGlvbkluZm8uT2RiY0Nvbm5lY3Rpb25TdHJp +bmcpID4gMCBUaGVuDQogICAgICBTZXQgbV9QZXJtYW5lbnRCYWNrZW5kUnN0ID0g +TWUuRGJDb25uZWN0aW9uLk9EQkMuT3BlblJlY29yZHNldFBUKE1lLkNvbm5lY3Rp +b25JbmZvLlBlcm1hbmVudEJhY2tlbmRSc3RTcWxUZXh0LCBkYk9wZW5TbmFwc2hv +dCkNCiAgIEVuZCBJZg0KICAgDQpFbmQgU3ViDQoNCg0KJyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCicNCicgRXZlbnQgaGFuZGxpbmcN +CicNCicgRGJDb25uZWN0aW9uaW5mbw0KJw0KUHJpdmF0ZSBTdWIgbV9EYkNvbm5l +Y3Rpb25JbmZvX0RibXNDb25uZWN0aW9uQ2hhbmdlZChCeVZhbCBuZXdDSUQgQXMg +U3RyaW5nKQ0KICAgJ0RiQ29ubmVjdGlvbiBuZXUgaW5pdGlhbGlzaWVyZW4gbGFz +c2VuDQogICANCk9uIEVycm9yIFJlc3VtZSBOZXh0DQoNCiAgICdBRE8tVmVyYmlu +ZHVuZyBzY2hsaWXfZW4NCiAgIE1lLkRiQ29ubmVjdGlvbi5BRE9EQi5EaXNwb3Nl +DQogICANCiAgICdPREJDLVZlcmJpbmR1bmcgc2NobGll32VuDQogICBNZS5EYkNv +bm5lY3Rpb24uT0RCQy5EaXNwb3NlDQogICANCiAgICdWZXJiaW5kdW5nIHp1bSBC +RSD2ZmZuZW4NCiAgIElmIERlZmF1bHRTZXR0aW5ncy5PcGVuUGVybWFuZW50QmFj +a2VuZFJlY29yZHNldCBUaGVuDQogICAgICBPcGVuUGVybWFuZW50QmFja2VuZFJl +Y29yZHNldA0KICAgRW5kIElmDQogICANCkVuZCBTdWINCg0KUHJpdmF0ZSBTdWIg +bV9EYkNvbm5lY3Rpb25JbmZvX0RibXNDb25uZWN0aW9uSW5mb0NsZWFyZWQoKQ0K +DQonPT4gVmVyYmluZHVuZ3NpbnN0YW56ZW4gZW50ZmVybmVuDQoNCk9uIEVycm9y +IFJlc3VtZSBOZXh0DQoNCiAgICdBRE8tVmVyYmluZHVuZyBzY2hsaWXfZW4NCiAg +IE1lLkRiQ29ubmVjdGlvbi5BRE9EQi5EaXNwb3NlDQogICANCiAgICdPREJDLVZl +cmJpbmR1bmcgc2NobGll32VuDQogICBNZS5EYkNvbm5lY3Rpb24uT0RCQy5EaXNw +b3NlDQogICANCkVuZCBTdWINCg0KUHJpdmF0ZSBTdWIgbV9EYkNvbm5lY3Rpb25J +bmZvX0Rpc3Bvc2VkKCkNCk9uIEVycm9yIFJlc3VtZSBOZXh0DQogICBTZXQgbV9E +YkNvbm5lY3Rpb25JbmZvID0gTm90aGluZw0KRW5kIFN1Yg0KDQpQcml2YXRlIFN1 +YiBtX0RiQ29ubmVjdGlvbkluZm9fTG9naW5EYXRhUmVxdWlyZWQoVXNlck5hbWUg +QXMgU3RyaW5nLCBQYXNzd29yZCBBcyBTdHJpbmcpDQogICBJZiBMZW4obV9EYm1z +VXNlck5hbWUpID4gMCBUaGVuDQogICAgICBVc2VyTmFtZSA9IG1fRGJtc1VzZXJO +YW1lDQogICAgICBQYXNzd29yZCA9IG1fRGJtc1VzZXJQYXNzd29yZA0KICAgRW5k +IElmDQpFbmQgU3ViDQoNClByaXZhdGUgU3ViIG1fRGJDb25uZWN0aW9uSW5mb19Q +YXNzd29yZENoYW5nZWQoKQ0KDQogICBNc2dCb3ggIkEgcmVzdGFydCBpcyByZXF1 +aXJlZCBmb3IgdGhlIE9EQkMgY29ubmVjdGlvbiBvZiB0aGUgbGlua2VkIHRhYmxl +cyEiICYgdmJOZXdMaW5lICYgXw0KICAgICAgICAgICJUaGUgY29ubmVjdGlvbiB2 +aWEgQURPREIvT0xFREIgcmVzcG9uZHMgdG8gdGhlIG5ldyBwYXNzd29yZCBmcm9t +IG5vdyBvbi4iDQoNCiAgICdEYkNvbm5lY3Rpb24gbmV1IGVpbnN0ZWxsZW4NCiAg +IEluaXREYkNvbm5lY3Rpb24NCg0KRW5kIFN1Yg0KDQonDQonIERiQ29ubmVjdGlv +bg0KJw0KUHJpdmF0ZSBTdWIgbV9EYkNvbm5lY3Rpb25fRGlzcG9zZWQoKQ0KT24g +RXJyb3IgUmVzdW1lIE5leHQNCiAgIFNldCBtX0RiQ29ubmVjdGlvbiA9IE5vdGhp +bmcNCkVuZCBTdWINCg0KUHJpdmF0ZSBTdWIgbV9EYkNvbm5lY3Rpb25fRXJyb3JF +bXB0eU9kYmNDb25uZWN0aW9uU3RyaW5nKEJ5VmFsIE1zZyBBcyBTdHJpbmcsIE5l +d0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nKQ0KICAgTmV3Q29ubmVjdGlvblN0 +cmluZyA9IE1lLkNvbm5lY3Rpb25JbmZvLk9kYmNDb25uZWN0aW9uU3RyaW5nDQpF +bmQgU3ViDQoNClByaXZhdGUgU3ViIG1fRGJDb25uZWN0aW9uX0Vycm9yRW1wdHlP +bGVkYkNvbm5lY3Rpb25TdHJpbmcoQnlWYWwgTXNnIEFzIFN0cmluZywgTmV3Q29u +bmVjdGlvblN0cmluZyBBcyBTdHJpbmcpDQogICBOZXdDb25uZWN0aW9uU3RyaW5n +ID0gTWUuQ29ubmVjdGlvbkluZm8uT2xlZGJDb25uZWN0aW9uU3RyaW5nDQpFbmQg +U3ViDQoNClByaXZhdGUgU3ViIG1fRGJDb25uZWN0aW9uX0Vycm9yTWlzc2luZ0N1 +cnJlbnRDb25uZWN0aW9uKEJ5VmFsIE1zZyBBcyBTdHJpbmcsIE5ld0N1cnJlbnRD +b25uZWN0aW9uIEFzIEFET0RCLkNvbm5lY3Rpb24pDQonIE5vIHJlc2V0IHJlcXVp +cmVkLCBjb25uZWN0aW9uIGlzIHNldCB2aWEgT2xlZGJDb25uZWN0aW9uU3RyaW5n +Lg0KJyBTaG91bGQgdGhpcyBhbHNvIGJlIG1pc3NpbmcsIEVycm9yRW1wdHlPbGVk +YkNvbm5lY3Rpb25TdHJpbmcgaXMgdHJpZ2dlcmVkLg0KRW5kIFN1Yg0KDQpQcml2 +YXRlIFN1YiBtX0RiQ29ubmVjdGlvbl9FcnJvck1pc3NpbmdDdXJyZW50RGIoQnlW +YWwgTXNnIEFzIFN0cmluZywgTmV3Q3VycmVudERiUmVmIEFzIERBTy5EYXRhYmFz +ZSkNCiAgIFNldCBOZXdDdXJyZW50RGJSZWYgPSBBcHBsaWNhdGlvbi5DdXJyZW50 +RGINCkVuZCBTdWINCg== + + 20231011081056 + data/DbConnectionManager.cls + + + DbConnectionSettings + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIkRiQ29ubmVjdGlvblNldHRpbmdz +Ig0KQXR0cmlidXRlIFZCX0dsb2JhbE5hbWVTcGFjZSA9IEZhbHNlDQpBdHRyaWJ1 +dGUgVkJfQ3JlYXRhYmxlID0gRmFsc2UNCkF0dHJpYnV0ZSBWQl9QcmVkZWNsYXJl +ZElkID0gRmFsc2UNCkF0dHJpYnV0ZSBWQl9FeHBvc2VkID0gRmFsc2UNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgQ2xhc3M6IGRh +dGEuRGJDb25uZWN0aW9uU2V0dGluZ3MNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQXV4aWxpYXJ5IGNsYXNzIGZvciBjYWNo +aW5nIHRoZSBjb25uZWN0aW9uIHBhcmFtZXRlcnMNCicNCicgQXV0aG9yOg0KJyAg +ICAgSm9zZWYgUG9ldHpsDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCic8Y29kZWxpYj4NCicgIDxmaWxlPmRhdGEvRGJDb25uZWN0aW9u +U2V0dGluZ3MuY2xzPC9maWxlPg0KJyAgPGxpY2Vuc2U+X2NvZGVsaWIvbGljZW5z +ZS5iYXM8L2xpY2Vuc2U+DQonICA8cmVmPjxuYW1lPkFET0RCPC9uYW1lPjxtYWpv +cj4yPC9tYWpvcj48bWlub3I+MTwvbWlub3I+PGd1aWQ+ezAwMDAwMjAxLTAwMDAt +MDAxMC04MDAwLTAwQUEwMDZEMkVBNH08L2d1aWQ+PC9yZWY+DQonPC9jb2RlbGli +Pg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0K +T3B0aW9uIENvbXBhcmUgRGF0YWJhc2UNCk9wdGlvbiBFeHBsaWNpdA0KDQonU3Fs +VG9vbHMgcGFyYW1ldGVyDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IFNxbERhdGVGb3JtYXQNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRGF0ZSBmb3Jt +YXQgc3RyaW5nDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQpQdWJsaWMgU3FsRGF0ZUZvcm1hdCBBcyBTdHJpbmcNCg0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0eTog +U3FsV2lsZENhcmRTdHJpbmcNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicNCicgU1FMIHdpbGRjYXJkDQonDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgU3FsV2lsZENhcmRT +dHJpbmcgQXMgU3RyaW5nDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IFNxbEJvb2xlYW5UcnVlU3RyaW5nDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIFNR +TCBzdHJpbmcgZm9yIGJvb2xlYW4gdHJ1ZQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFNxbEJvb2xlYW5UcnVlU3Ry +aW5nIEFzIFN0cmluZw0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonIFByb3BlcnR5OiBEZWZhdWx0QWRvZGJDdXJzb3JMb2NhdGlv +bg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0K +JyBEZWZhdWx0IHBhcmFtZXRlciB2YWx1ZSBmb3IgQURPREIuQ3Vyc29yTG9jYXRp +b25FbnVtDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQpQdWJsaWMgRGVmYXVsdEFkb2RiQ3Vyc29yTG9jYXRpb24gQXMgQURPREIu +Q3Vyc29yTG9jYXRpb25FbnVtDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IE9wZW5QZXJtYW5lbnRCYWNrZW5k +UmVjb3Jkc2V0DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIE9wZW4gcGVybWFuZW50IGJhY2tlbmQgcmVjb3Jkc2V0IGlmIGNv +bm5lY3RlZA0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KUHVibGljIE9wZW5QZXJtYW5lbnRCYWNrZW5kUmVjb3Jkc2V0IEFzIEJv +b2xlYW4NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJyBQcm9wZXJ0eTogQ2xvbmUNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NCicNCicgQ2xvbmUgb2YgY3VycmVudCBjb25maWcNCicN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1Ymxp +YyBGdW5jdGlvbiBDbG9uZSgpIEFzIERiQ29ubmVjdGlvblNldHRpbmdzDQogICBE +aW0gTmV3T2JqZWN0IEFzIERiQ29ubmVjdGlvblNldHRpbmdzDQogICBTZXQgTmV3 +T2JqZWN0ID0gTmV3IERiQ29ubmVjdGlvblNldHRpbmdzDQogICBOZXdPYmplY3Qu +Q29weUZyb20gTWUNCiAgIFNldCBDbG9uZSA9IE5ld09iamVjdA0KRW5kIEZ1bmN0 +aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicgUHJvcGVydHk6IENvcHlGcm9tDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQonDQonIENvcHkgRGJDb25uZWN0aW9uU2V0dGluZ3MN +CicNCicgUGFyYW1ldGVyczoNCicgICAgIE5ld1NldHRpbmdzIC0gRGJDb25uZWN0 +aW9uU2V0dGluZ3MgdG8gY29weQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFN1YiBDb3B5RnJvbShCeVZhbCBOZXdT +ZXR0aW5ncyBBcyBEYkNvbm5lY3Rpb25TZXR0aW5ncykNCg0KICAgV2l0aCBOZXdT +ZXR0aW5ncw0KICAgICAgDQogICAgICBTcWxEYXRlRm9ybWF0ID0gLlNxbERhdGVG +b3JtYXQNCiAgICAgIFNxbFdpbGRDYXJkU3RyaW5nID0gLlNxbFdpbGRDYXJkU3Ry +aW5nDQogICAgICBTcWxCb29sZWFuVHJ1ZVN0cmluZyA9IC5TcWxCb29sZWFuVHJ1 +ZVN0cmluZw0KICAgICAgDQogICAgICBEZWZhdWx0QWRvZGJDdXJzb3JMb2NhdGlv +biA9IC5EZWZhdWx0QWRvZGJDdXJzb3JMb2NhdGlvbg0KICAgICAgDQogICAgICBP +cGVuUGVybWFuZW50QmFja2VuZFJlY29yZHNldCA9IC5PcGVuUGVybWFuZW50QmFj +a2VuZFJlY29yZHNldA0KICAgICAgDQogICBFbmQgV2l0aA0KICAgDQpFbmQgU3Vi +DQo= + + 20231011081056 + data/DbConnectionSettings.cls + + + LoginForm + //5WAGUAcgBzAGkAbwBuACAAPQAyADEADQAKAFYAZQByAHMAaQBvAG4AUgBlAHEA +dQBpAHIAZQBkACAAPQAyADAADQAKAFAAdQBiAGwAaQBzAGgATwBwAHQAaQBvAG4A +IAA9ADEADQAKAEMAaABlAGMAawBzAHUAbQAgAD0ALQAxADkAMgA1ADAAMQA0ADYA +NwAyAA0ACgBCAGUAZwBpAG4AIABGAG8AcgBtAA0ACgAgACAAIAAgAEEAbABsAG8A +dwBGAGkAbAB0AGUAcgBzACAAPQAgAE4AbwB0AEQAZQBmAGEAdQBsAHQADQAKACAA +IAAgACAAUABvAHAAVQBwACAAPQAgAE4AbwB0AEQAZQBmAGEAdQBsAHQADQAKACAA +IAAgACAAUgBlAGMAbwByAGQAUwBlAGwAZQBjAHQAbwByAHMAIAA9ACAATgBvAHQA +RABlAGYAYQB1AGwAdAANAAoAIAAgACAAIABDAG8AbgB0AHIAbwBsAEIAbwB4ACAA +PQAgAE4AbwB0AEQAZQBmAGEAdQBsAHQADQAKACAAIAAgACAAQQB1AHQAbwBDAGUA +bgB0AGUAcgAgAD0AIABOAG8AdABEAGUAZgBhAHUAbAB0AA0ACgAgACAAIAAgAE4A +YQB2AGkAZwBhAHQAaQBvAG4AQgB1AHQAdABvAG4AcwAgAD0AIABOAG8AdABEAGUA +ZgBhAHUAbAB0AA0ACgAgACAAIAAgAEQAaQB2AGkAZABpAG4AZwBMAGkAbgBlAHMA +IAA9ACAATgBvAHQARABlAGYAYQB1AGwAdAANAAoAIAAgACAAIABEAGUAZgBhAHUA +bAB0AFYAaQBlAHcAIAA9ADAADQAKACAAIAAgACAAUwBjAHIAbwBsAGwAQgBhAHIA +cwAgAD0AMAANAAoAIAAgACAAIABWAGkAZQB3AHMAQQBsAGwAbwB3AGUAZAAgAD0A +MQANAAoAIAAgACAAIABUAGEAYgB1AGwAYQByAEYAYQBtAGkAbAB5ACAAPQAxADIA +NAANAAoAIAAgACAAIABCAG8AcgBkAGUAcgBTAHQAeQBsAGUAIAA9ADMADQAKACAA +IAAgACAAUABpAGMAdAB1AHIAZQBBAGwAaQBnAG4AbQBlAG4AdAAgAD0AMgANAAoA +IAAgACAAIABEAGEAdABhAHMAaABlAGUAdABHAHIAaQBkAGwAaQBuAGUAcwBCAGUA +aABhAHYAaQBvAHIAIAA9ADMADQAKACAAIAAgACAAQwB5AGMAbABlACAAPQAxAA0A +CgAgACAAIAAgAEcAcgBpAGQAWQAgAD0AMQAwAA0ACgAgACAAIAAgAFcAaQBkAHQA +aAAgAD0AMwA5ADEAMQANAAoAIAAgACAAIABEAGEAdABhAHMAaABlAGUAdABGAG8A +bgB0AEgAZQBpAGcAaAB0ACAAPQAxADAADQAKACAAIAAgACAASQB0AGUAbQBTAHUA +ZgBmAGkAeAAgAD0ANgANAAoAIAAgACAAIABMAGUAZgB0ACAAPQAxADEAOQA1ADUA +DQAKACAAIAAgACAAVABvAHAAIAA9ADMAMQAwADUADQAKACAAIAAgACAAUgBpAGcA +aAB0ACAAPQAxADcAMQA3ADUADQAKACAAIAAgACAAQgBvAHQAdABvAG0AIAA9ADcA +MwAwADUADQAKACAAIAAgACAARABhAHQAYQBzAGgAZQBlAHQARwByAGkAZABsAGkA +bgBlAHMAQwBvAGwAbwByACAAPQAxADIANgAzADIAMgA1ADYADQAKACAAIAAgACAA +TwBuAFUAbgBsAG8AYQBkACAAPQAiAFsARQB2AGUAbgB0ACAAUAByAG8AYwBlAGQA +dQByAGUAXQAiAA0ACgAgACAAIAAgAFIAZQBjAFMAcgBjAEQAdAAgAD0AIABCAGUA +ZwBpAG4ADQAKACAAIAAgACAAIAAgACAAIAAwAHgANgA4ADUANgA4AGUAYgAxADkA +ZQBlADIAZQAyADQAMAANAAoAIAAgACAAIABFAG4AZAANAAoAIAAgACAAIABHAFUA +SQBEACAAPQAgAEIAZQBnAGkAbgANAAoAIAAgACAAIAAgACAAIAAgADAAeABlAGQA +MABhAGQANgBiAGYANwAxAGEAMwA3AGUANAA5AGIANgBmAGEAYQA1ADMAMwAxADYA +MwBmADgAYgA3ADkADQAKACAAIAAgACAARQBuAGQADQAKACAAIAAgACAATgBhAG0A +ZQBNAGEAcAAgAD0AIABCAGUAZwBpAG4ADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MABhAGMAYwAwAGUANQA1ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MABjADAAMAAwADAAMAAwADAANQAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAANAAoAIAAgACAAIABFAG4AZAANAAoAIAAgACAA +IABDAGEAcAB0AGkAbwBuACAAPQAiAEwAbwBnAGkAbgAiAA0ACgAgACAAIAAgAEQA +YQB0AGEAcwBoAGUAZQB0AEYAbwBuAHQATgBhAG0AZQAgAD0AIgBBAHIAaQBhAGwA +IgANAAoAIAAgACAAIABQAHIAdABNAGkAcAAgAD0AIABCAGUAZwBpAG4ADQAKACAA +IAAgACAAIAAgACAAIAAwAHgAYQBlADAANQAwADAAMAAwAGEAZQAwADUAMAAwADAA +MABhAGUAMAA1ADAAMAAwADAAYQBlADAANQAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAyADAAMQBjADAAMAAwADAAZQAwADEAMAAwADAAMAAwADAAMQAwADAAMAAwADAA +MAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAxADAAMAAwADAAMAAwADYA +OAAwADEAMAAwADAAMAAwADAAMAAwADAAMAAwADAAYQAxADAANwAwADAAMAAwADAA +MQAwADAAMAAwADAAMAAwADEAMAAwADAAMAAwADAADQAKACAAIAAgACAARQBuAGQA +DQAKACAAIAAgACAAUAByAHQARABlAHYATQBvAGQAZQAgAD0AIABCAGUAZwBpAG4A +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADUAMwA0AGUAMAAxADcAZAA0ADAA +OABkADAAMABmAGYAZgBmAGYAZgBmAGYAMAAwADAAMAAwADAAMAAwADcAZQAwAGUA +NwBhADAAMAAwADQANQA0ADQAZQAwADEAYwAwAGEAOAAwAGQAMAAwADMAZQBkADgA +NABmADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAxADAANAAwADAA +MAA2ADkAYwAwADAANAA0ADAAMwA1ADMAZQBmADgAMAAwADEAMAAxADAAMAAwADkA +MAAwADkAYQAwAGIAMwA0ADAAOAA2ADQAMAAwADAAMQAwADAAMABmADAAMAA1ADgA +MAAyADAAMgAwADAAMAAxADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +NQA4ADAAMgAwADMAMAAwADAAMQAwADAANAAxADMANAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADEAOABiAGIAYQAwADEAMAA1AGMANQA0ADQAZQAwADEA +MgBjADUAMwA0AGUAMAAxADEAYwAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAYgA4ADgAZQA5ADMANgBjADIAYwA1ADMAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADEA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMQAwADAAMAAwADAAMAAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAyADAAMAAwADAAMAAwADAAMQAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADUAMAA1ADIA +NAA5ADUANgAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAZQAyADMAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAxADgA +MAAwADAAMAAwADAAMAAwADAAMAAxADAAMgA3ADEAMAAyADcAMQAwADIANwAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAxADAAMgA3ADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAANwAwADAAMAA0ADQAMAAzADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADMAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMQAwADAAMAA1ADAAMwA0ADAAMwAwADAAMgA4ADgAOAAwADQA +MAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAxADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MgA0ADAAMQBkAGYAOABjADAAMwAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAA1ADAAMAAwADQAMAAwAGYAZgAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAgACwADQAKACAAIAAgACAA +IAAgACAAIAAwAHgAMAAxADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADcAMAAwADAAMAAwADAAMAA1ADMA +NABkADUANAA0AGEAMAAwADAAMAAwADAAMAAwADEAMAAwADAANgAwADAAMAAgACwA +DQAKACAAIAAgACAAIAAgACAAIAAwAHgANAA2ADAAMAA3ADIAMAAwADYANQAwADAA +NgA1ADAAMAA1ADAAMAAwADQANAAwADAANAA2ADAAMAA1AGYAMAAwADUAOAAwADAA +NQAwADAAMAAwADAAMAAwADUAMgA2ADUANwAzADYAZgA2AGMANwA1ADcANAA2ADkA +NgBmADYAZQAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgAMAAwADMANgAzADAA +MwAwADYANAA3ADAANgA5ADAAMAA1ADAANgAxADYANwA2ADUANQAzADYAOQA3AGEA +NgA1ADAAMAA0AGMANgA1ADcANAA3ADQANgA1ADcAMgAwADAANQAwADYAMQA2ADcA +NgA1ADUAMgA2ADUANgA3ADYAOQAgACwADQAKACAAIAAgACAAIAAgACAAIAAwAHgA +NgBmADYAZQAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAANAAoAIAAgACAAIABFAG4A +ZAANAAoAIAAgACAAIABQAHIAdABEAGUAdgBOAGEAbQBlAHMAIAA9ACAAQgBlAGcA +aQBuAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAOAAwADAAMQAzADAAMAAxAGIA +MAAwADAAMQAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADQANgA3ADIA +NgA1ADYANQA1ADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADQANAA0ADYA +NQA4ADUAMAAzADEAMwBhADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAA +MAB4ADAAMAAwADAAMAAwAA0ACgAgACAAIAAgAEUAbgBkAA0ACgAgACAAIAAgAE8A +bgBMAG8AYQBkACAAPQAiAFsARQB2AGUAbgB0ACAAUAByAG8AYwBlAGQAdQByAGUA +XQAiAA0ACgAgACAAIAAgAEYAaQBsAHQAZQByAE8AbgBMAG8AYQBkACAAPQAwAA0A +CgAgACAAIAAgAEEAbABsAG8AdwBMAGEAeQBvAHUAdABWAGkAZQB3ACAAPQAwAA0A +CgAgACAAIAAgAEQAYQB0AGEAcwBoAGUAZQB0AEcAcgBpAGQAbABpAG4AZQBzAEMA +bwBsAG8AcgAxADIAIAA9ADEAMgA2ADMAMgAyADUANgANAAoAIAAgACAAIABQAHIA +dABEAGUAdgBNAG8AZABlAFcAIAA9ACAAQgBlAGcAaQBuAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAANABmADAAMQAzADIAMAAwADAAMAAwADAAYwAwADAA +MABkADcAMABmADAAMAAwADAAZAA3ADAAZgAwAGEAMAAwADAAMAAwADAAMAAxADAA +MAAwADAAMAAwADAAMAAwADEAMAAwADAAMQA1ADAAMAAzADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADEAOAAxADUAZAA3ADAAZgBjADAAYQA4ADAA +ZAAwADAANwBmADAAMAAwADAAMAAwADEAOAAxADUAZAA3ADAAZgAyADAAMQA1AGQA +NwAwAGYANwA4AGQAZQA0AGYAMAAxADAAMAAwADAAMAAwADAAMAAzAGUAMAAyADAA +MAAzAGMAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMQAwADQAMAAwADAA +NgBkAGMAMAAwADQANAAwADMANQAzAGUAZgA4ADAAMAAxADAAMQAwADAAMAA5ADAA +MAA5AGEAMABiADMANAAwADgANgA0ADAAMAAwADEAMAAwADAAZgAwADAANQA4ADAA +MgAwADIAMAAwADAAMQAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADUA +OAAwADIAMAAzADAAMAAwADEAMAAwADQAMQAwADAAMwA0ADAAMAAwADAAMAAwAGMA +NABkAGUANABmADAAMQAwADAAMAAwADAAMAAwADAANQA0AGIAOAA0AGYAMAAxADIA +MABhAGUAMgA5ADcANwA4ADMAOQAxADcANgBmAGYAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4AGYAZQBmAGYAZgBmAGYAZgAxADgAYgA1ADQAZgAwADEAYQBjADYA +ZQAyADYANwA3ADMAYwAwADAAMAAwADAAMAA0ADgAMAAwADAAMAAwADAAYwA4ADAA +MgBkADcAMABmAGUAOABiADQANABmADAAMQAzADgAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAZAA3ADAAZgBiADAAMAA0ADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAxADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADEAMAAwADAA +MAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMgAwADAAMAAwADAA +MAAwADEAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAA1ADAANQAyADQAOQA1ADYAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4AGUA +MgAzADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMQA4ADAAMAAwADAAMAAwADAAMAAwADAAMQAwADIANwAxADAAMgA3ADEA +MAAyADcAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMQAwADIA +NwAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADcAMAAwADAANAA0ADAA +MwAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAzADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADEAMAAwADAANQAwADMANAAwADMAMAAwADIA +OAA4ADgAMAA0ADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMQAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADIANAAwADEAZABmADgAYwAwADMAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAANQAwADAAMAA0ADAAMABmAGYAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0A +CgAgACAAIAAgACAAIAAgACAAMAB4ADAAMQAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAA3ADAAMAAwADAA +MAAwADAANQAzADQAZAA1ADQANABhADAAMAAwADAAMAAwADAAMAAxADAAMAAwADYA +MAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADQANgAwADAANwAyADAA +MAA2ADUAMAAwADYANQAwADAANQAwADAAMAA0ADQAMAAwADQANgAwADAANQBmADAA +MAA1ADgAMAAwADUAMAAwADAAMAAwADAAMAA1ADIANgA1ADcAMwA2AGYANgBjADcA +NQA3ADQANgA5ADYAZgA2AGUAIAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAA +MAAzADYAMwAwADMAMAA2ADQANwAwADYAOQAwADAANQAwADYAMQA2ADcANgA1ADUA +MwA2ADkANwBhADYANQAwADAANABjADYANQA3ADQANwA0ADYANQA3ADIAMAAwADUA +MAA2ADEANgA3ADYANQA1ADIANgA1ADYANwA2ADkAIAAsAA0ACgAgACAAIAAgACAA +IAAgACAAMAB4ADYAZgA2AGUAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAADQAKACAA +IAAgACAARQBuAGQADQAKACAAIAAgACAAUAByAHQARABlAHYATgBhAG0AZQBzAFcA +IAA9ACAAQgBlAGcAaQBuAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAANAAwADAA +MABmADAAMAAxADcAMAAwADAAMQAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAIAAsAA0ACgAgACAAIAAgACAAIAAgACAA +MAB4ADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAANAA2ADAAMAA3ADIAMAAwADYANQAwADAANgA1ADAAMAA1ADAA +MAAwADQANAAwADAANAA2ADAAMAA1ADgAMAAwADUAMAAwADAAIAAsAA0ACgAgACAA +IAAgACAAIAAgACAAMAB4ADMAMQAwADAAMwBhADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +IAAsAA0ACgAgACAAIAAgACAAIAAgACAAMAB4ADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAAMAAwADAA +MAAwAA0ACgAgACAAIAAgAEUAbgBkAA0ACgAgACAAIAAgAE4AbwBTAGEAdgBlAEMA +VABJAFcAaABlAG4ARABpAHMAYQBiAGwAZQBkACAAPQAxAA0ACgAgACAAIAAgAEIA +ZQBnAGkAbgANAAoAIAAgACAAIAAgACAAIAAgAEIAZQBnAGkAbgAgAEwAYQBiAGUA +bAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAQgBhAGMAawBTAHQAeQBsAGUA +IAA9ADAADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEYAbwBuAHQATgBhAG0A +ZQAgAD0AIgBUAGEAaABvAG0AYQAiAA0ACgAgACAAIAAgACAAIAAgACAARQBuAGQA +DQAKACAAIAAgACAAIAAgACAAIABCAGUAZwBpAG4AIABDAG8AbQBtAGEAbgBkAEIA +dQB0AHQAbwBuAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABXAGkAZAB0AGgA +IAA9ADEANwAwADEADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgAZQBpAGcA +aAB0ACAAPQAyADgAMwANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAARgBvAG4A +dABTAGkAegBlACAAPQA4AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABGAG8A +bgB0AFcAZQBpAGcAaAB0ACAAPQA0ADAAMAANAAoAIAAgACAAIAAgACAAIAAgACAA +IAAgACAARgBvAHIAZQBDAG8AbABvAHIAIAA9AC0AMgAxADQANwA0ADgAMwA2ADMA +MAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAARgBvAG4AdABOAGEAbQBlACAA +PQAiAFQAYQBoAG8AbQBhACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEIA +bwByAGQAZQByAEwAaQBuAGUAUwB0AHkAbABlACAAPQAwAA0ACgAgACAAIAAgACAA +IAAgACAARQBuAGQADQAKACAAIAAgACAAIAAgACAAIABCAGUAZwBpAG4AIABUAGUA +eAB0AEIAbwB4AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABGAEUATABpAG4A +ZQBCAHIAZQBhAGsAIAA9ACAATgBvAHQARABlAGYAYQB1AGwAdAANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAUwBwAGUAYwBpAGEAbABFAGYAZgBlAGMAdAAgAD0A +MgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAATwBsAGQAQgBvAHIAZABlAHIA +UwB0AHkAbABlACAAPQAwAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABCAG8A +cgBkAGUAcgBMAGkAbgBlAFMAdAB5AGwAZQAgAD0AMAANAAoAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAVwBpAGQAdABoACAAPQAxADcAMAAxAA0ACgAgACAAIAAgACAA +IAAgACAAIAAgACAAIABMAGEAYgBlAGwAWAAgAD0ALQAxADcAMAAxAA0ACgAgACAA +IAAgACAAIAAgACAAIAAgACAAIABGAG8AbgB0AE4AYQBtAGUAIAA9ACIAVABhAGgA +bwBtAGEAIgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAQQBzAGkAYQBuAEwA +aQBuAGUAQgByAGUAYQBrACAAPQAyADUANQANAAoAIAAgACAAIAAgACAAIAAgAEUA +bgBkAA0ACgAgACAAIAAgACAAIAAgACAAQgBlAGcAaQBuACAAUwBlAGMAdABpAG8A +bgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAASABlAGkAZwBoAHQAIAA9ADEA +NwAwADEADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEIAYQBjAGsAQwBvAGwA +bwByACAAPQAtADIAMQA0ADcANAA4ADMANgAzADMADQAKACAAIAAgACAAIAAgACAA +IAAgACAAIAAgAE4AYQBtAGUAIAA9ACIARABlAHQAYQBpAGwAYgBlAHIAZQBpAGMA +aAAiAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABHAFUASQBEACAAPQAgAEIA +ZQBnAGkAbgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAwAHgA +ZgBkAGQANgBlADEAOQBkADkANQBkAGYAZAA0ADQAZABhAGEANABlAGIANgA1ADEA +ZgAyAGQAMAA1ADcANwA4AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIABFAG4A +ZAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAQgBlAGcAaQBuAA0ACgAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEIAZQBnAGkAbgAgAFQAZQB4AHQA +QgBvAHgADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IABBAGwAbABvAHcAQQB1AHQAbwBDAG8AcgByAGUAYwB0ACAAPQAgAE4AbwB0AEQA +ZQBmAGEAdQBsAHQADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABTAHAAZQBjAGkAYQBsAEUAZgBmAGUAYwB0ACAAPQAwAA0ACgAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAATwB2AGUAcgBsAGEA +cABGAGwAYQBnAHMAIAA9ADgANQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgAEkATQBFAFMAZQBuAHQAZQBuAGMAZQBNAG8AZABlACAA +PQAzAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +TABlAGYAdAAgAD0AMQA1ADgAMwANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgAFQAbwBwACAAPQAyADIANQANAAoAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFcAaQBkAHQAaAAgAD0AMgAxADUA +NAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEgA +ZQBpAGcAaAB0ACAAPQAyADUANQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgAEYAbwBuAHQAUwBpAHoAZQAgAD0AOQANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEIAYQBjAGsAQwBvAGwA +bwByACAAPQAtADIAMQA0ADcANAA4ADMANgA0ADMADQAKACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIABGAG8AcgBlAEMAbwBsAG8AcgAgAD0A +LQAyADEANAA3ADQAOAAzADYANAAwAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAATgBhAG0AZQAgAD0AIgB0AHgAdABVAEkARAAiAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAARwBVAEkA +RAAgAD0AIABCAGUAZwBpAG4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgADAAeAA5AGYAMwAxAGMAYQAxAGIAZgBjADUA +NABiADUANABmAGEANwBhADcAYQAxADMANQA3ADcAZQBjAGUAOABlADkADQAKACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABFAG4AZAANAAoA +DQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABCAGUA +ZwBpAG4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgAEIAZQBnAGkAbgAgAEwAYQBiAGUAbAANAAoAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABPAHYA +ZQByAGwAYQBwAEYAbABhAGcAcwAgAD0AOAA1AA0ACgAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEwAZQBmAHQA +IAA9ADEANgA1AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgAFQAbwBwACAAPQAyADIANQANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IABXAGkAZAB0AGgAIAA9ADEAMgA5ADMADQAKACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASABlAGkAZwBoAHQA +IAA9ADIANQA1AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgAEYAbwBuAHQAUwBpAHoAZQAgAD0AOQANAAoA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABOAGEAbQBlACAAPQAiAGwAYQBiAEwAbwBnAGkAbgBOAGEAbQBlACIA +DQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAQwBhAHAAdABpAG8AbgAgAD0AIgBMAG8AZwBpAG4AIABuAGEA +bQBlACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAVABhAGcAIAA9ACIATABBAE4ARwA6ACIADQAKACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAARwBVAEkARAAgAD0AIABCAGUAZwBpAG4ADQAKACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAwAHgAZABmADUAYgA3ADAAZgAzAGUAMwBmADMAZgA0ADQANQA4AGMAMQA0AGQA +OQAwADAAZAAzADIANwA5AGYAOQBiAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEUAbgBkAA0ACgAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABFAG4A +ZAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEUA +bgBkAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEUAbgBkAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEIAZQBnAGkAbgAgAFQA +ZQB4AHQAQgBvAHgADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABBAGwAbABvAHcAQQB1AHQAbwBDAG8AcgByAGUAYwB0ACAAPQAgAE4A +bwB0AEQAZQBmAGEAdQBsAHQADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIABTAHAAZQBjAGkAYQBsAEUAZgBmAGUAYwB0ACAAPQAwAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAATwB2AGUA +cgBsAGEAcABGAGwAYQBnAHMAIAA9ADgANQANAAoAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgAEkATQBFAFMAZQBuAHQAZQBuAGMAZQBNAG8A +ZABlACAAPQAzAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAATABlAGYAdAAgAD0AMQA1ADgAMwANAAoAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgAFQAbwBwACAAPQA2ADIAMQANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFcAaQBkAHQAaAAgAD0A +MgAxADUANAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgAEgAZQBpAGcAaAB0ACAAPQAyADUANQANAAoAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgAEYAbwBuAHQAUwBpAHoAZQAgAD0AOQANAAoA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFQAYQBiAEkA +bgBkAGUAeAAgAD0AMQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgAEIAYQBjAGsAQwBvAGwAbwByACAAPQAtADIAMQA0ADcANAA4ADMA +NgA0ADMADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IABGAG8AcgBlAEMAbwBsAG8AcgAgAD0ALQAyADEANAA3ADQAOAAzADYANAAwAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAATgBhAG0A +ZQAgAD0AIgB0AHgAdABQAHcAZAAiAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAASQBuAHAAdQB0AE0AYQBzAGsAIAA9ACIAUABhAHMA +cwB3AG8AcgBkACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABHAFUASQBEACAAPQAgAEIAZQBnAGkAbgANAAoAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAMAB4AGEAMwA3ADkA +NQBiADIAMwBhADAAMAAyADcANAA0ADMAYgBkADcANQA3AGEANQAyAGMAYgBmAGYA +MwAwAGUANgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgAEUAbgBkAA0ACgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgAEIAZQBnAGkAbgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAQgBlAGcAaQBuACAATABhAGIAZQBsAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgAE8AdgBlAHIAbABhAHAARgBsAGEAZwBzACAAPQA4ADUADQAKACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAATABlAGYAdAAgAD0AMQA2ADUADQAKACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAVABvAHAAIAA9ADYA +MgAxAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgAFcAaQBkAHQAaAAgAD0AMQAyADkAMwANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IABIAGUAaQBnAGgAdAAgAD0AMgA1ADUADQAKACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAARgBvAG4AdABTAGkA +egBlACAAPQA5AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgAE4AYQBtAGUAIAA9ACIAbABhAGIAUABhAHMA +cwB3AG8AcgBkACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAQwBhAHAAdABpAG8AbgAgAD0AIgBQAGEA +cwBzAHcAbwByAGQAIgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIABUAGEAZwAgAD0AIgBMAEEATgBHADoA +IgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIABHAFUASQBEACAAPQAgAEIAZQBnAGkAbgANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgADAAeABlADMAMQA2ADcANgA1AGMAOAAxAGEANgBlADUANAA1AGIA +OAA2ADIAMwA4ADkAMwBkADQAOABkADQAYQBiAGQADQAKACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAARQBuAGQA +DQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgAEUAbgBkAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAARQBuAGQADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +RQBuAGQADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAQgBlAGcA +aQBuACAAQwBvAG0AbQBhAG4AZABCAHUAdAB0AG8AbgANAAoAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAEQAZQBmAGEAdQBsAHQAIAA9ACAA +TgBvAHQARABlAGYAYQB1AGwAdAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgAE8AdgBlAHIAbABhAHAARgBsAGEAZwBzACAAPQA4ADUA +DQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABBAGMA +YwBlAHMAcwBLAGUAeQAgAD0ANwA5AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAATABlAGYAdAAgAD0AMQA3ADAADQAKACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABUAG8AcAAgAD0AMQAxADMA +MwANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFcA +aQBkAHQAaAAgAD0AMQA0ADEAOAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgAEgAZQBpAGcAaAB0ACAAPQA0ADEAOAANAAoAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFQAYQBiAEkAbgBkAGUA +eAAgAD0AMgANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgAE4AYQBtAGUAIAA9ACIAYwBtAGQATABvAGcAaQBuACIADQAKACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABDAGEAcAB0AGkAbwBuACAA +PQAiACYATwBLACIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABPAG4AQwBsAGkAYwBrACAAPQAiAFsARQB2AGUAbgB0ACAAUAByAG8A +YwBlAGQAdQByAGUAXQAiAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAARwBVAEkARAAgAD0AIABCAGUAZwBpAG4ADQAKACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgADAAeAAwAGMA +NQBhADYANwAwADkANwBmAGIAMwBmAGEANABkAGEAMAA5ADgANwA3AGMAMAA1ADcA +NQA2ADkAZQA4ADgADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABFAG4AZAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgAFUAbgBpAGMAbwBkAGUAQQBjAGMAZQBzAHMASwBlAHkAIAA9ADcA +OQANAAoADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IABXAGUAYgBJAG0AYQBnAGUAUABhAGQAZABpAG4AZwBMAGUAZgB0ACAAPQAyAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAVwBlAGIA +SQBtAGEAZwBlAFAAYQBkAGQAaQBuAGcAVABvAHAAIAA9ADIADQAKACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABXAGUAYgBJAG0AYQBnAGUA +UABhAGQAZABpAG4AZwBSAGkAZwBoAHQAIAA9ADEADQAKACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIABXAGUAYgBJAG0AYQBnAGUAUABhAGQA +ZABpAG4AZwBCAG8AdAB0AG8AbQAgAD0AMQANAAoAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIABFAG4AZAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABCAGUAZwBpAG4AIABDAG8AbQBtAGEAbgBkAEIAdQB0AHQAbwBuAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAQwBhAG4A +YwBlAGwAIAA9ACAATgBvAHQARABlAGYAYQB1AGwAdAANAAoAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAE8AdgBlAHIAbABhAHAARgBsAGEA +ZwBzACAAPQA4ADUADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABBAGMAYwBlAHMAcwBLAGUAeQAgAD0ANgA1AA0ACgAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAATABlAGYAdAAgAD0AMgAzADIA +NAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFQA +bwBwACAAPQAxADEAMwAzAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAVwBpAGQAdABoACAAPQAxADQAMQA4AA0ACgAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAASABlAGkAZwBoAHQAIAA9ADQA +MQA4AA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +VABhAGIASQBuAGQAZQB4ACAAPQAzAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAATgBhAG0AZQAgAD0AIgBjAG0AZABDAGEAbgBjAGUA +bAAiAA0ACgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +QwBhAHAAdABpAG8AbgAgAD0AIgAmAEEAYgBiAHIAZQBjAGgAZQBuACIADQAKACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABPAG4AQwBsAGkA +YwBrACAAPQAiAFsARQB2AGUAbgB0ACAAUAByAG8AYwBlAGQAdQByAGUAXQAiAA0A +CgAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAARwBVAEkA +RAAgAD0AIABCAGUAZwBpAG4ADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgADAAeAA1ADkAZAA5ADEAYwA1AGQAYQAzADcA +MwBjAGYANABjADgANQA3ADIAMwAwAGYAZAAzADMAYwAxAGIAMwBjADgADQAKACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABFAG4AZAANAAoA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgAFUAbgBpAGMA +bwBkAGUAQQBjAGMAZQBzAHMASwBlAHkAIAA9ADYANQANAAoADQAKACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABXAGUAYgBJAG0AYQBnAGUA +UABhAGQAZABpAG4AZwBMAGUAZgB0ACAAPQAyAA0ACgAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIAAgACAAIAAgACAAVwBlAGIASQBtAGEAZwBlAFAAYQBkAGQA +aQBuAGcAVABvAHAAIAA9ADIADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIAAgACAAIABXAGUAYgBJAG0AYQBnAGUAUABhAGQAZABpAG4AZwBSAGkA +ZwBoAHQAIAA9ADEADQAKACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAA +IAAgACAAIABXAGUAYgBJAG0AYQBnAGUAUABhAGQAZABpAG4AZwBCAG8AdAB0AG8A +bQAgAD0AMQANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIAAgACAAIABFAG4A +ZAANAAoAIAAgACAAIAAgACAAIAAgACAAIAAgACAARQBuAGQADQAKACAAIAAgACAA +IAAgACAAIABFAG4AZAANAAoAIAAgACAAIABFAG4AZAANAAoARQBuAGQADQAKAEMA +bwBkAGUAQgBlAGgAaQBuAGQARgBvAHIAbQANAAoAQQB0AHQAcgBpAGIAdQB0AGUA +IABWAEIAXwBHAGwAbwBiAGEAbABOAGEAbQBlAFMAcABhAGMAZQAgAD0AIABGAGEA +bABzAGUADQAKAEEAdAB0AHIAaQBiAHUAdABlACAAVgBCAF8AQwByAGUAYQB0AGEA +YgBsAGUAIAA9ACAAVAByAHUAZQANAAoAQQB0AHQAcgBpAGIAdQB0AGUAIABWAEIA +XwBQAHIAZQBkAGUAYwBsAGEAcgBlAGQASQBkACAAPQAgAFQAcgB1AGUADQAKAEEA +dAB0AHIAaQBiAHUAdABlACAAVgBCAF8ARQB4AHAAbwBzAGUAZAAgAD0AIABGAGEA +bABzAGUADQAKACcALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ADQAKACcA +IABGAG8AcgBtADoAIABMAG8AZwBpAG4ARgBvAHIAbQANAAoAJwAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQANAAoAJwAvACoAKgANAAoAJwAgAFUAcwBlAHIA +IABsAG8AZwBpAG4AIABmAG8AcgBtAA0ACgAnACoAKgAvAA0ACgAnAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0ALQAtAC0A +LQAtAC0ALQAtAC0ALQAtAC0ALQAtAA0ACgAnADwAYwBvAGQAZQBsAGkAYgA+AA0A +CgAnACAAIAA8AGYAaQBsAGUAPgB1AHMAZQByAC8AbABvAGcAaQBuAC8ATABvAGcA +aQBuAEYAbwByAG0ALgBmAHIAbQA8AC8AZgBpAGwAZQA+AA0ACgAnACAAIAA8AGwA +aQBjAGUAbgBzAGUAPgBfAGMAbwBkAGUAbABpAGIALwBsAGkAYwBlAG4AcwBlAC4A +YgBhAHMAPAAvAGwAaQBjAGUAbgBzAGUAPgANAAoAJwA8AC8AYwBvAGQAZQBsAGkA +YgA+AA0ACgAnAA0ACgBPAHAAdABpAG8AbgAgAEMAbwBtAHAAYQByAGUAIABEAGEA +dABhAGIAYQBzAGUADQAKAE8AcAB0AGkAbwBuACAARQB4AHAAbABpAGMAaQB0AA0A +CgANAAoAIwBJAGYAIABVAFMARQBMAE8AQwBBAEwASQBaAEEAVABJAE8ATgAgAD0A +IAAxACAAVABoAGUAbgANAAoAUAByAGkAdgBhAHQAZQAgAFcAaQB0AGgARQB2AGUA +bgB0AHMAIABtAF8ATAAxADAAbgBEAGkAYwB0ACAAQQBzACAATAAxADAAbgBEAGkA +YwB0AA0ACgBBAHQAdAByAGkAYgB1AHQAZQAgAG0AXwBMADEAMABuAEQAaQBjAHQA +LgBWAEIAXwBWAGEAcgBIAGUAbABwAEkARAAgAD0AIAAtADEADQAKACMARQBuAGQA +IABJAGYADQAKAA0ACgBQAHUAYgBsAGkAYwAgAEUAdgBlAG4AdAAgAEwAbwBnAG8A +bgAoAEIAeQBWAGEAbAAgAEwAbwBnAGkAbgBOAGEAbQBlACAAQQBzACAAUwB0AHIA +aQBuAGcALAAgAEIAeQBWAGEAbAAgAFAAYQBzAHMAdwBvAHIAZAAgAEEAcwAgAFMA +dAByAGkAbgBnACwAIABCAHkAUgBlAGYAIABDAGEAbgBjAGUAbAAgAEEAcwAgAEIA +bwBvAGwAZQBhAG4AKQANAAoAUAB1AGIAbABpAGMAIABFAHYAZQBuAHQAIABDAGEA +bgBjAGUAbABsAGUAZAAoACkADQAKAA0ACgBQAHUAYgBsAGkAYwAgAG0AXwBDAGwA +bwBzAGUARgBvAHIAbQBPAEsAIABBAHMAIABCAG8AbwBsAGUAYQBuAA0ACgANAAoA +UAByAGkAdgBhAHQAZQAgAEQAZQBjAGwAYQByAGUAIABQAHQAcgBTAGEAZgBlACAA +UwB1AGIAIABDAG8AcAB5AE0AZQBtAG8AcgB5ACAATABpAGIAIAAiAGsAZQByAG4A +ZQBsADMAMgAiACAAQQBsAGkAYQBzACAAIgBSAHQAbABNAG8AdgBlAE0AZQBtAG8A +cgB5ACIAIAAoAEQAZQBzAHQAIABBAHMAIABBAG4AeQAsACAAUwByAGMAIABBAHMA +IABBAG4AeQAsACAAQgB5AFYAYQBsACAATABlAG4AZwB0AGgAIABBAHMAIABMAG8A +bgBnACkADQAKAA0ACgBQAHIAaQB2AGEAdABlACAAUwB1AGIAIABjAG0AZABDAGEA +bgBjAGUAbABfAEMAbABpAGMAawAoACkADQAKAE8AbgAgAEUAcgByAG8AcgAgAFIA +ZQBzAHUAbQBlACAATgBlAHgAdAANAAoAIAAgACAAUgBhAGkAcwBlAEUAdgBlAG4A +dAAgAEMAYQBuAGMAZQBsAGwAZQBkAA0ACgAgACAAIABtAF8AQwBsAG8AcwBlAEYA +bwByAG0ATwBLACAAPQAgAFQAcgB1AGUADQAKACAAIAAgAEQAbwBDAG0AZAAuAEMA +bABvAHMAZQAgAGEAYwBGAG8AcgBtACwAIABNAGUALgBOAGEAbQBlAA0ACgBFAG4A +ZAAgAFMAdQBiAA0ACgANAAoAUAByAGkAdgBhAHQAZQAgAFMAdQBiACAAYwBtAGQA +TABvAGcAaQBuAF8AQwBsAGkAYwBrACgAKQANAAoADQAKACAAIAAgAEQAaQBtACAA +cwB0AHIATABvAGcAaQBuAE4AYQBtAGUAIABBAHMAIABTAHQAcgBpAG4AZwANAAoA +IAAgACAARABpAG0AIABzAHQAcgBMAG8AZwBpAG4AUABhAHMAcwB3AG8AcgBkACAA +QQBzACAAUwB0AHIAaQBuAGcADQAKACAAIAAgAEQAaQBtACAAYgBvAGwAQwBhAG4A +YwBlAGwAIABBAHMAIABCAG8AbwBsAGUAYQBuAA0ACgANAAoAIAAgACAAcwB0AHIA +TABvAGcAaQBuAE4AYQBtAGUAIAA9ACAATQBlAC4AdAB4AHQAVQBJAEQAIAAmACAA +dgBiAE4AdQBsAGwAUwB0AHIAaQBuAGcADQAKACAAIAAgAHMAdAByAEwAbwBnAGkA +bgBQAGEAcwBzAHcAbwByAGQAIAA9ACAATQBlAC4AdAB4AHQAUAB3AGQAIAAmACAA +dgBiAE4AdQBsAGwAUwB0AHIAaQBuAGcADQAKACAAIAAgAA0ACgAgACAAIABJAGYA +IABMAGUAbgAoAHMAdAByAEwAbwBnAGkAbgBOAGEAbQBlACkAIAAqACAATABlAG4A +KABzAHQAcgBMAG8AZwBpAG4AUABhAHMAcwB3AG8AcgBkACkAIAA9ACAAMAAgAFQA +aABlAG4ADQAKACAAIAAgACAAIAAgAE0AcwBnAEIAbwB4ACAAIgBQAGwAZQBhAHMA +ZQAgAGUAbgB0AGUAcgAgAGwAbwBnAGkAbgAgAG4AYQBtAGUAIABhAG4AZAAgAHAA +YQBzAHMAdwBvAHIAZAAiAA0ACgAgACAAIAAgACAAIABJAGYAIABMAGUAbgAoAHMA +dAByAEwAbwBnAGkAbgBOAGEAbQBlACkAIAA9ACAAMAAgAFQAaABlAG4ADQAKACAA +IAAgACAAIAAgACAAIAAgAE0AZQAuAHQAeAB0AFUASQBEAC4AUwBlAHQARgBvAGMA +dQBzAA0ACgAgACAAIAAgACAAIABFAGwAcwBlAA0ACgAgACAAIAAgACAAIAAgACAA +IABNAGUALgB0AHgAdABQAHcAZAAuAFMAZQB0AEYAbwBjAHUAcwANAAoAIAAgACAA +IAAgACAARQBuAGQAIABJAGYADQAKACAAIAAgACAAIAAgAEUAeABpAHQAIABTAHUA +YgANAAoAIAAgACAARQBuAGQAIABJAGYADQAKACAAIAAgAA0ACgAgACAAIABSAGEA +aQBzAGUARQB2AGUAbgB0ACAATABvAGcAbwBuACgAcwB0AHIATABvAGcAaQBuAE4A +YQBtAGUALAAgAHMAdAByAEwAbwBnAGkAbgBQAGEAcwBzAHcAbwByAGQALAAgAGIA +bwBsAEMAYQBuAGMAZQBsACkADQAKACAAIAAgAEkAZgAgAGIAbwBsAEMAYQBuAGMA +ZQBsACAAVABoAGUAbgANAAoAIAAgACAAIAAgACAATQBlAC4AdAB4AHQAUAB3AGQA +LgBTAGUAdABGAG8AYwB1AHMADQAKACAAIAAgACAAIAAgAEUAeABpAHQAIABTAHUA +YgANAAoAIAAgACAARQBuAGQAIABJAGYADQAKACAAIAAgACAAIAAgAA0ACgAgACAA +IABtAF8AQwBsAG8AcwBlAEYAbwByAG0ATwBLACAAPQAgAFQAcgB1AGUADQAKACAA +IAAgAEQAbwBDAG0AZAAuAEMAbABvAHMAZQAgAGEAYwBGAG8AcgBtACwAIABNAGUA +LgBOAGEAbQBlAA0ACgANAAoARQBuAGQAIABTAHUAYgANAAoADQAKAFAAcgBpAHYA +YQB0AGUAIABTAHUAYgAgAEYAbwByAG0AXwBMAG8AYQBkACgAKQANAAoAIAAgACAA +DQAKACAAIAAgAEQAaQBtACAAQQByAGcAcwAoACkAIABBAHMAIABTAHQAcgBpAG4A +ZwANAAoAIAAgACAARABpAG0AIABMAG8AZwBpAG4ARgBvAHIAbQBCAHIAaQBkAGcA +ZQBQAHQAcgAgAEEAcwAgAEwAbwBuAGcAUAB0AHIADQAKAA0ACgAjAEkAZgAgAFUA +UwBFAEwATwBDAEEATABJAFoAQQBUAEkATwBOACAAPQAgADEAIABUAGgAZQBuAA0A +CgAgACAAIABMADEAMABuAC4AVAByAGEAbgBzAGwAYQB0AGUAQwBvAG4AdAByAG8A +bABzACAATQBlAC4AQwBvAG4AdAByAG8AbABzAA0ACgAgACAAIABTAGUAdAAgAG0A +XwBMADEAMABuAEQAaQBjAHQAIAA9ACAATAAxADAAbgANAAoAIwBFAG4AZAAgAEkA +ZgANAAoADQAKACAAIAAgAEkAZgAgAEwAZQBuACgATQBlAC4ATwBwAGUAbgBBAHIA +ZwBzACkAIAA+ACAAMAAgAFQAaABlAG4AIAAnAE8AcABlAG4AQQByAGcAcwA9ACAA +IgBPAGIAagBQAHQAcgBAAEMAYQBwAHQAaQBvAG4AQABTAHQAYQBuAGQAYQByAGQA +VQBzAGUAcgAiAA0ACgAgACAAIAAgACAAIABBAHIAZwBzACAAPQAgAFMAcABsAGkA +dAAoAE0AZQAuAE8AcABlAG4AQQByAGcAcwAsACAAIgBAACIAKQANAAoAIAAgACAA +IAAgACAADQAKACAAIAAgACAAIAAgAEwAbwBnAGkAbgBGAG8AcgBtAEIAcgBpAGQA +ZwBlAFAAdAByACAAPQAgAFYAYQBsACgAQQByAGcAcwAoADAAKQApAA0ACgANAAoA +IAAgACAAIAAgACAATQBlAC4AQwBhAHAAdABpAG8AbgAgAD0AIABBAHIAZwBzACgA +MQApAA0ACgAgACAAIAAgACAAIABJAGYAIABVAEIAbwB1AG4AZAAoAEEAcgBnAHMA +KQAgAD4AIAAxACAAVABoAGUAbgANAAoAIAAgACAAIAAgACAAIAAgACAATQBlAC4A +dAB4AHQAVQBJAEQALgBWAGEAbAB1AGUAIAA9ACAAQQByAGcAcwAoADIAKQANAAoA +IAAgACAAIAAgACAARQBsAHMAZQANAAoAIAAgACAAIAAgACAAIAAgACAATQBlAC4A +dAB4AHQAVQBJAEQALgBWAGEAbAB1AGUAIAA9ACAAdgBiAE4AdQBsAGwAUwB0AHIA +aQBuAGcADQAKACAAIAAgACAAIAAgAEUAbgBkACAASQBmAA0ACgAgACAAIAAgACAA +IAANAAoAIAAgACAAIAAgACAASQBmACAATABlAG4AKABNAGUALgB0AHgAdABVAEkA +RAAuAFYAYQBsAHUAZQApACAAPgAgADAAIABUAGgAZQBuAA0ACgAgACAAIAAgACAA +IAAgACAAIABNAGUALgB0AHgAdABQAHcAZAAuAFMAZQB0AEYAbwBjAHUAcwANAAoA +IAAgACAAIAAgACAARQBuAGQAIABJAGYADQAKAA0ACgAgACAAIABFAG4AZAAgAEkA +ZgANAAoADQAKACAAIAAgAEQAaQBtACAAdABlAG0AcABPAGIAagAgAEEAcwAgAE8A +YgBqAGUAYwB0AA0ACgAgACAAIABTAGUAdAAgAHQAZQBtAHAATwBiAGoAIAA9ACAA +RwBlAHQATwBiAGoAZQBjAHQARgByAG8AbQBPAGIAagBQAHQAcgAoAEwAbwBnAGkA +bgBGAG8AcgBtAEIAcgBpAGQAZwBlAFAAdAByACkADQAKACAAIAAgAEkAZgAgAE4A +bwB0ACAAKAB0AGUAbQBwAE8AYgBqACAASQBzACAATgBvAHQAaABpAG4AZwApACAA +VABoAGUAbgANAAoAIAAgACAAIAAgACAAUwBlAHQAIAB0AGUAbQBwAE8AYgBqAC4A +TABvAGcAaQBuAEYAbwByAG0AIAA9ACAATQBlACAAJwBUAGgAaQBzACAAbQBhAGsA +ZQBzACAAdABoAGUAIABlAHYAZQBuAHQAcwAgAHAAbwBzAHMAaQBiAGwAZQAgAGQA +ZQBzAHAAaQB0AGUAIABkAGkAYQBsAG8AZwB1AGUAIABtAG8AZABlAA0ACgAgACAA +IABFAG4AZAAgAEkAZgANAAoADQAKAEUAbgBkACAAUwB1AGIADQAKAA0ACgBQAHIA +aQB2AGEAdABlACAAUwB1AGIAIABGAG8AcgBtAF8AVQBuAGwAbwBhAGQAKABDAGEA +bgBjAGUAbAAgAEEAcwAgAEkAbgB0AGUAZwBlAHIAKQANAAoATwBuACAARQByAHIA +bwByACAAUgBlAHMAdQBtAGUAIABOAGUAeAB0AA0ACgAgACAAIABJAGYAIABOAG8A +dAAgAG0AXwBDAGwAbwBzAGUARgBvAHIAbQBPAEsAIABUAGgAZQBuACAAUgBhAGkA +cwBlAEUAdgBlAG4AdAAgAEMAYQBuAGMAZQBsAGwAZQBkAA0ACgAjAEkAZgAgAFUA +UwBFAEwATwBDAEEATABJAFoAQQBUAEkATwBOACAAPQAgADEAIABUAGgAZQBuAA0A +CgAgACAAIABTAGUAdAAgAG0AXwBMADEAMABuAEQAaQBjAHQAIAA9ACAATgBvAHQA +aABpAG4AZwANAAoAIwBFAG4AZAAgAEkAZgANAAoARQBuAGQAIABTAHUAYgANAAoA +DQAKAFAAcgBpAHYAYQB0AGUAIABGAHUAbgBjAHQAaQBvAG4AIABHAGUAdABPAGIA +agBlAGMAdABGAHIAbwBtAE8AYgBqAFAAdAByACgAbABQAHQAcgAgAEEAcwAgAEwA +bwBuAGcAUAB0AHIAKQAgAEEAcwAgAE8AYgBqAGUAYwB0AA0ACgANAAoAIAAgACAA +RABpAG0AIABvAGIAagAgAEEAcwAgAE8AYgBqAGUAYwB0AA0ACgAgACAAIABDAG8A +cAB5AE0AZQBtAG8AcgB5ACAAbwBiAGoALAAgAGwAUAB0AHIALAAgADQADQAKACAA +IAAgAFMAZQB0ACAARwBlAHQATwBiAGoAZQBjAHQARgByAG8AbQBPAGIAagBQAHQA +cgAgAD0AIABvAGIAagANAAoAIAAgACAAQwBvAHAAeQBNAGUAbQBvAHIAeQAgAG8A +YgBqACwAIAAwACYALAAgADQADQAKACAAIAAgAA0ACgBFAG4AZAAgAEYAdQBuAGMA +dABpAG8AbgANAAoADQAKACMASQBmACAAVQBTAEUATABPAEMAQQBMAEkAWgBBAFQA +SQBPAE4AIAA9ACAAMQAgAFQAaABlAG4ADQAKAFAAcgBpAHYAYQB0AGUAIABTAHUA +YgAgAG0AXwBMADEAMABuAEQAaQBjAHQAXwBMAGEAbgBnAHUAYQBnAGUAQwBoAGEA +bgBnAGUAZAAoACkADQAKACAAIAAgAEwAMQAwAG4ALgBUAHIAYQBuAHMAbABhAHQA +ZQBDAG8AbgB0AHIAbwBsAHMAIABNAGUALgBDAG8AbgB0AHIAbwBsAHMADQAKAEUA +bgBkACAAUwB1AGIADQAKACMARQBuAGQAIABJAGYA + + 20231011081056 + user/login/LoginForm.frm + + + OdbcHandler + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIk9kYmNIYW5kbGVyIg0KQXR0cmli +dXRlIFZCX0dsb2JhbE5hbWVTcGFjZSA9IEZhbHNlDQpBdHRyaWJ1dGUgVkJfQ3Jl +YXRhYmxlID0gRmFsc2UNCkF0dHJpYnV0ZSBWQl9QcmVkZWNsYXJlZElkID0gVHJ1 +ZQ0KQXR0cmlidXRlIFZCX0V4cG9zZWQgPSBGYWxzZQ0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBDbGFzczogZGF0YS5vZGJjLk9k +YmNIYW5kbGVyDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIE9EQkMgZGF0YSBjb25uZWN0aW9uIG1ldGhvZHMNCicNCicgQXV0 +aG9yOg0KJyAgICAgSm9zZWYgUG9ldHpsDQonDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCic8Y29kZWxpYj4NCicgIDxmaWxlPmRhdGEvb2Ri +Yy9PZGJjSGFuZGxlci5jbHM8L2ZpbGU+DQonICA8bGljZW5zZT5fY29kZWxpYi9s +aWNlbnNlLmJhczwvbGljZW5zZT4NCicgIDxyZWY+PG5hbWU+REFPPC9uYW1lPjxt +YWpvcj41PC9tYWpvcj48bWlub3I+MDwvbWlub3I+PGd1aWQ+ezAwMDI1RTAxLTAw +MDAtMDAwMC1DMDAwLTAwMDAwMDAwMDA0Nn08L2d1aWQ+PC9yZWY+DQonICA8dGVz +dD5fdGVzdC9kYXRhL29kYmMvT2RiY0hhbmRsZXJIb29rVGVzdHMuY2xzPC90ZXN0 +Pg0KJzwvY29kZWxpYj4NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicNCk9wdGlvbiBDb21wYXJlIFRleHQNCk9wdGlvbiBFeHBsaWNp +dA0KDQpQcml2YXRlIENvbnN0IEVSUk5SX05PQ09ORklHIEFzIExvbmcgPSB2Yk9i +amVjdEVycm9yICsgMTAwMg0KDQonT0RCQyBjb25uZWN0aW9uIHN0cmluZw0KUHJp +dmF0ZSBtX09kYmNDb25uZWN0aW9uU3RyaW5nIEFzIFN0cmluZw0KDQonREFPIERh +dGFiYXNlDQpQcml2YXRlIG1fRGFvRGIgQXMgREFPLkRhdGFiYXNlICAgICdsb2Nh +bCBkYXRhYmFzZSBpbnN0YW5jZSAuLi4gZS5nLiB0byBjcmVhdGUgVGVtcC1RdWVy +eURlZg0KUHJpdmF0ZSBtX0Rhb0RiQkUgQXMgREFPLkRhdGFiYXNlICAnQmFja2Vu +ZCAoZGF0YWJhc2UgaW5zdGFuY2UgdmlhIE9EQkMgY29ubmVjdGlvbikNCg0KJyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMNCicgR3JvdXA6IEV2ZW50cw0KDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEV2ZW50OiBFcnJvck1pc3NpbmdD +dXJyZW50RGINCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NCicgRXZlbnQgZm9yIG1pc3NpbmcgQ3VycmVudERiIHJlZmVyZW5jZQ0KJw0K +JyBQYXJhbWV0ZXJzOg0KJyAgICAgTXNnICAgICAgICAgICAgIC0gTWVzc2FnZSBh +Ym91dCB0aGUgY2F1c2Ugb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcuIChOb3QgeWV0 +IHVzZWQpDQonICAgICBOZXdDdXJyZW50RGJSZWYgLSBEQU8uRGF0YWJhc2UgcmVm +ZXJlbmNlIHRvIGJlIHVzZWQgZm9yIEN1cnJlbnREYg0KJw0KJyBSZW1hcmtzOg0K +JyAgICAgVGhlIHJlcXVpcmVkIERBTy5EYXRhYmFzZSByZWZlcmVuY2UgY2FuIGJl +IHBhc3NlZCBvbiB2aWEgdGhlIEJ5UmVmIHBhcmFtZXRlciBOZXdDdXJyZW50RGJS +ZWYuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQpQdWJsaWMgRXZlbnQgRXJyb3JNaXNzaW5nQ3VycmVudERiKEJ5VmFsIE1zZyBB +cyBTdHJpbmcsIEJ5UmVmIE5ld0N1cnJlbnREYlJlZiBBcyBEQU8uRGF0YWJhc2Up +DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +RXZlbnQ6IEVycm9yRW1wdHlDb25uZWN0aW9uU3RyaW5nDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEV2ZW50IGZvciBtaXNz +aW5nIE9EQkMgY29ubmVjdGlvbiBzdHJpbmcNCicNCicgUGFyYW1ldGVyczoNCicg +ICAgIE1zZyAgICAgICAgICAgICAgICAgIC0gTWVzc2FnZSBhYm91dCB0aGUgY2F1 +c2Ugb2YgdGhlIGV2ZW50IHRyaWdnZXJpbmcuIChOb3QgeWV0IHVzZWQpDQonICAg +ICBOZXdDb25uZWN0aW9uU3RyaW5nICAtIE9EQkMgQ29ubmVjdGlvbnN0cmluZw0K +Jw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIGFwcHJvcHJpYXRlIE9EQkMgY29ubmVj +dGlvbiBzdHJpbmcgY2FuIGJlIHBhc3NlZCBvbiB2aWEgdGhlIEJ5UmVmIHBhcmFt +ZXRlciBOZXdDb25uZWN0aW9uU3RyaW5nLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IEVycm9yRW1wdHlD +b25uZWN0aW9uU3RyaW5nKEJ5VmFsIE1zZyBBcyBTdHJpbmcsIEJ5UmVmIE5ld0Nv +bm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nKQ0KDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEV2ZW50OiBEYk9iamVjdFJlbGlua2Vk +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQon +IEluZm8gYWJvdXQgdGhlIGxhc3QgbGlua2VkIGVsZW1lbnQNCicNCicgUGFyYW1l +dGVyczoNCicgICAgIExhc3REYk9iamVjdE5hbWUgIC0gdGhlIGxhc3QgbGlua2Vk +IHRhYmxlIG9yIHZpZXcNCicgICAgIENvdW50ZXIgICAgICAgICAgIC0gTnVtYmVy +IG9mIGxpbmtlZCBlbGVtZW50cyBzaW5jZSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQN +CicNCicgUmVtYXJrczoNCicgICAgIFVzZWQgaW4gdGhlIFJlbGlua1RhYmxlc0Fu +ZFF1ZXJpZXMgbWV0aG9kLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IERiT2JqZWN0UmVsaW5rZWQoQnlW +YWwgTGFzdERiT2JqZWN0TmFtZSBBcyBTdHJpbmcsIEJ5VmFsIENvdW50ZXIgQXMg +TG9uZykNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJyBFdmVudDogRGJPYmplY3REZWxldGVkDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEluZm8gYWJvdXQgdGhlIGxhc3Qg +ZGVsZXRlZCBlbGVtZW50DQonDQonIFBhcmFtZXRlcnM6DQonICAgICBMYXN0RGJP +YmplY3ROYW1lICAtIHRoZSBsYXN0IGRlbGV0ZWQgdGFibGUgb3Igdmlldw0KJyAg +ICAgQ291bnRlciAgICAgICAgICAgLSBOdW1iZXIgb2YgZGVsZXRlZCBlbGVtZW50 +cyBzaW5jZSB0aGUgbWV0aG9kIHdhcyBjYWxsZWQNCicNCicgUmVtYXJrczoNCicg +ICAgIFVzZWQgaW4gdGhlIFJlbGlua1RhYmxlc0FuZFF1ZXJpZXMgbWV0aG9kLg0K +Jw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVi +bGljIEV2ZW50IERiT2JqZWN0RGVsZXRlZChCeVZhbCBMYXN0RGJPYmplY3ROYW1l +IEFzIFN0cmluZywgQnlWYWwgQ291bnRlciBBcyBMb25nKQ0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEV2ZW50OiBIb29rSW5z +ZXJ0SWRlbnRpdHlSZXR1cm4NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicNCicgRXZlbnQgZm9yIG1pc3NpbmcgT0xFREIgY29ubmVj +dGlvbiBzdHJpbmcNCicNCicgUGFyYW1ldGVyczoNCicgICAgIEluc2VydFNxbCAg +ICAgICAgICAgIC0gU1FMIHRleHQgb2YgaW5zZXJ0IHN0YXRlbWVudA0KJyAgICAg +QWN0aXZlRGIgICAgICAgICAgICAgLSBBRE9EQiBDb25uZWN0aW9uIHRvIHVzZQ0K +JyAgICAgSWRlbnRpdHlTZWxlY3RTdHJpbmcgLSBJbnB1dCBzdHJpbmcgdG8gdXNl +DQonICAgICBIb29rUmVzcG9uc2VNb2RlICAgICAtIHJlc3VtZSBhY3Rpb24gYWZ0 +ZXIgZXZlbnQgY2FsbDogMCAuLi4gY29kZSByZXN1bWUgYWZ0ZXIgZXZlbnQsIDEg +ZXhpdCBmdW5jdGlvbiBhZnRlciBldmVudA0KJyAgICAgSG9va1Jlc3BvbnNlTWVz +c2FnZSAgLSByZXR1cm4gdmFsdWUgb2YgZnVuY3Rpb24gKGUuZy4gSW5zZXJ0SWRl +bnRpdHlSZXR1cm4pIHdoZW4gSG9va1Jlc3BvbnNlTW9kZSA8PiAwDQonDQonIFJl +bWFya3M6DQonICAgICBOZXcgdmFsdWVzIGNhbiBiZSBwYXNzZWQgb24gdmlhIHRo +ZSBCeVJlZiBwYXJhbWV0ZXJzLg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEV2ZW50IEhvb2tJbnNlcnRJZGVudGl0 +eVJldHVybihCeVJlZiBJbnNlcnRTUUwgQXMgU3RyaW5nLCBfDQogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVmIEFjdGl2ZURiIEFzIERB +Ty5EYXRhYmFzZSwgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBCeVJlZiBJZGVudGl0eVNlbGVjdFN0cmluZyBBcyBTdHJpbmcsIF8NCiAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlSZWYgUmVzcG9u +c2VNb2RlIEFzIExvbmcsIEJ5UmVmIEhvb2tSZXNwb25zZU1lc3NhZ2UgQXMgVmFy +aWFudCkNCg0KUHJpdmF0ZSBtX0hvb2tzRW5hYmxlZCBBcyBCb29sZWFuDQoNCicj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjDQonIEdyb3VwOiBDbGFzcyBjb250cm9sDQoNCicNCicgSW5p +dCAvIFRlcm1pbmF0ZQ0KJyAtLS0tLS0tLS0tLS0tLS0tDQonDQonUHJpdmF0ZSBT +dWIgQ2xhc3NfSW5pdGlhbGl6ZSgpDQonJw0KJ0VuZCBTdWINCg0KUHJpdmF0ZSBT +dWIgQ2xhc3NfVGVybWluYXRlKCkNCiAgIERpc3Bvc2UNCkVuZCBTdWINCg0KUHVi +bGljIFN1YiBEaXNwb3NlKCkNCg0KT24gRXJyb3IgUmVzdW1lIE5leHQNCg0KICAg +U2V0IG1fRGFvRGIgPSBOb3RoaW5nDQogICANCiAgIElmIE5vdCBtX0Rhb0RiQkUg +SXMgTm90aGluZyBUaGVuDQogICAgICBtX0Rhb0RiQkUuQ2xvc2UNCiAgICAgIFNl +dCBtX0Rhb0RiQkUgPSBOb3RoaW5nDQogICBFbmQgSWYNCg0KRW5kIFN1Yg0KDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFByb3Bl +cnR5OiBIb29rc0VuYWJsZWQNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicgQWN0aXZlIEhvb2tzDQonDQonIFJlbWFya3M6DQonICAg +ICBVc2VkIGluIEluc2VydElkZW50aXR5UmV0dXJuDQonDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpGcmllbmQgUHJvcGVydHkgR2V0 +IEhvb2tzRW5hYmxlZCgpIEFzIEJvb2xlYW4NCiAgIEhvb2tzRW5hYmxlZCA9IG1f +SG9va3NFbmFibGVkDQpFbmQgUHJvcGVydHkNCg0KRnJpZW5kIFByb3BlcnR5IExl +dCBIb29rc0VuYWJsZWQoQnlWYWwgTmV3VmFsdWUgQXMgQm9vbGVhbikNCiAgIG1f +SG9va3NFbmFibGVkID0gTmV3VmFsdWUNCkVuZCBQcm9wZXJ0eQ0KDQonIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIw0KJyBHcm91cDogRGF0YSBDb25uZWN0aW9uDQoNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IEN1cnJl +bnREYg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +Jw0KJyBEQU8uRGF0YWJhc2UtSW5zdGFueiBkZXMgRnJvbnRlbmRzIGJ6dy4gamVu +ZXIgSmV0LURCIGluIGRlciBkaWUgUGFzcy1UaHJvdWdoLUFiZnJhZ2VuIGVyc3Rl +bGx0IHdlcmRlbiBzb2xsZW4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQgQ3VycmVudERiKCkg +QXMgREFPLkRhdGFiYXNlDQogICBJZiAobV9EYW9EYiBJcyBOb3RoaW5nKSBUaGVu +DQogICAgICAnRXZlbnQgYXVzbPZzZW4sIGRhbWl0IG5ldWUgUmVmZXJlbnogZ2Vs +aWVmZXJ0IHdlcmRlbiBrYW5uDQogICAgICBSYWlzZUV2ZW50IEVycm9yTWlzc2lu +Z0N1cnJlbnREYigiT2RiY0hhbmRsZXIuQ3VycmVudERiOiB1bmF2YWlsYWJsZSBD +dXJyZW50RGItRGF0YWJhc2UiLCBtX0Rhb0RiKQ0KICAgRW5kIElmDQogICBTZXQg +Q3VycmVudERiID0gbV9EYW9EYg0KRW5kIFByb3BlcnR5DQoNClB1YmxpYyBQcm9w +ZXJ0eSBTZXQgQ3VycmVudERiKEJ5UmVmIE5ld0N1cnJlbnREYiBBcyBEQU8uRGF0 +YWJhc2UpDQogICBTZXQgbV9EYW9EYiA9IE5ld0N1cnJlbnREYg0KRW5kIFByb3Bl +cnR5DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicgUHJvcGVydHk6IEN1cnJlbnREYkJFDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIERhdGFiYXNlLVJlZmVyZW56IHp1bSBC +YWNrZW5kDQonDQonIFJlbWFya3MNCicgICAgIERBTy5EYXRhYmFzZSB3aXJkIPxi +ZXIgREJFbmdpbmUuT3BlbkRhdGFiYXNlKCIiLCBkYkRyaXZlckNvbXBsZXRlLCBG +YWxzZSwgPENvbm5lY3Rpb25TdHJpbmc+KSBnZfZmZm5ldC4NCicNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0 +eSBHZXQgQ3VycmVudERiQkUoKSBBcyBEQU8uRGF0YWJhc2UNCiAgIERpbSB0ZW1w +T2RiQ29ubmVjdGlvbnN0cmluZyBBcyBTdHJpbmcNCiAgIElmIChtX0Rhb0RiQkUg +SXMgTm90aGluZykgVGhlbg0KICAgICAgdGVtcE9kYkNvbm5lY3Rpb25zdHJpbmcg +PSBDb25uZWN0aW9uU3RyaW5nDQogICAgICBJZiBMZW4odGVtcE9kYkNvbm5lY3Rp +b25zdHJpbmcpID4gMCBUaGVuDQogICAgICAgICBTZXQgbV9EYW9EYkJFID0gREJF +bmdpbmUuT3BlbkRhdGFiYXNlKCIiLCBkYkRyaXZlckNvbXBsZXRlLCBGYWxzZSwg +dGVtcE9kYkNvbm5lY3Rpb25zdHJpbmcpDQogICAgICBFbmQgSWYNCiAgIEVuZCBJ +Zg0KICAgU2V0IEN1cnJlbnREYkJFID0gbV9EYW9EYkJFDQpFbmQgUHJvcGVydHkN +Cg0KUHVibGljIFByb3BlcnR5IFNldCBDdXJyZW50RGJCRShCeVJlZiBOZXdDdXJy +ZW50RGJCRSBBcyBEQU8uRGF0YWJhc2UpDQogICBDbG9zZURhb0RiQkUNCiAgIFNl +dCBtX0Rhb0RiQkUgPSBOZXdDdXJyZW50RGJCRQ0KICAgSWYgTm90IChOZXdDdXJy +ZW50RGJCRSBJcyBOb3RoaW5nKSBUaGVuDQogICAgICBtX09kYmNDb25uZWN0aW9u +U3RyaW5nID0gTmV3Q3VycmVudERiQkUuQ29ubmVjdA0KICAgRW5kIElmDQpFbmQg +UHJvcGVydHkNCg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonIFByb3BlcnR5OiBDb25uZWN0aW9uU3RyaW5nDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIE9EQkMgQ29ubmVj +dGlvbiBzdHJpbmcNCicNCicgUmVtYXJrczoNCicgICAgIEV4YW1wbGUgLSAiT0RC +QztEUklWRVI9e1NRTCBTZXJ2ZXJ9O0RBVEFCQVNFPXRlc3RkYjtTRVJWRVI9KGxv +Y2FsKVxTUUwyMDA1O1RydXN0ZWRfQ29ubmVjdGlvbj1ZZXM7Ig0KJw0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3Bl +cnR5IEdldCBDb25uZWN0aW9uU3RyaW5nKCkgQXMgU3RyaW5nDQogICBJZiBMZW4o +bV9PZGJjQ29ubmVjdGlvblN0cmluZykgPSAwIFRoZW4NCiAgICAgIElmIE5vdCAo +bV9EYW9EYkJFIElzIE5vdGhpbmcpIFRoZW4NCk9uIEVycm9yIFJlc3VtZSBOZXh0 +DQogICAgICAgICBtX09kYmNDb25uZWN0aW9uU3RyaW5nID0gbV9EYW9EYkJFLkNv +bm5lY3QNCk9uIEVycm9yIEdvVG8gMA0KICAgICAgRW5kIElmDQogICAgICBJZiBM +ZW4obV9PZGJjQ29ubmVjdGlvblN0cmluZykgPSAwIFRoZW4NCiAgICAgICAgIFJh +aXNlRXZlbnQgRXJyb3JFbXB0eUNvbm5lY3Rpb25TdHJpbmcoIk9kYmNIYW5kbGVy +LkNvbm5lY3Rpb25TdHJpbmciLCBtX09kYmNDb25uZWN0aW9uU3RyaW5nKQ0KICAg +ICAgRW5kIElmDQogICBFbmQgSWYNCiAgIENvbm5lY3Rpb25TdHJpbmcgPSBtX09k +YmNDb25uZWN0aW9uU3RyaW5nDQpFbmQgUHJvcGVydHkNCg0KUHVibGljIFByb3Bl +cnR5IExldCBDb25uZWN0aW9uU3RyaW5nKEJ5VmFsIFZhbHVlIEFzIFN0cmluZykN +CiAgIElmIG1fT2RiY0Nvbm5lY3Rpb25TdHJpbmcgPSBWYWx1ZSBUaGVuDQogICAg +ICBFeGl0IFByb3BlcnR5DQogICBFbmQgSWYNCiAgIENsb3NlRGFvRGJCRQ0KICAg +bV9PZGJjQ29ubmVjdGlvblN0cmluZyA9IFZhbHVlDQpFbmQgUHJvcGVydHkNCg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5j +dGlvbjogT3BlblJlY29yZHNldA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KJw0KJyBPcGVuIERBTy5SZWNvcmRzZXQNCicNCicgUGFy +YW1ldGVyczoNCicgICAgIFNvdXJjZSAgICAgICAgICAgIC0gU1FMIHN0YXRlbWVu +dCBvciB0YWJsZSBvciBxdWVyeSBuYW1lDQonICAgICBSZWNvcmRzZXRUeXBlICAg +ICAtIERBTy5SZWNvcmRzZXRUeXBlRW51bSAoU3RhbmRhcmQ6IGRiT3BlbkR5bmFz +ZXQpDQonICAgICBSZWNvcmRzZXRPcHRpb25zICAtIERBTy5SZWNvcmRzZXRPcHRp +b25FbnVtIChTdGFuZGFyZDogZGJTZWVDaGFuZ2VzKQ0KJyAgICAgTG9ja0VkaXQg +ICAgICAgICAgLSBEQU8uTG9ja1R5cGVFbnVtIChTdGFuZGFyZDogZGJPcHRpbWlz +dGljKQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgREFPLlJlY29yZHNldA0KJw0KJyBS +ZW1hcmtzOg0KJyAgICAgVXNlcyA8Q3VycmVudERiQkU+IHRvIG9wZW4gdGhlIHJl +Y29yZHNldC4NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NClB1YmxpYyBGdW5jdGlvbiBPcGVuUmVjb3Jkc2V0KEJ5VmFsIFNvdXJjZSBB +cyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFs +IFJlY29yZHNldFR5cGUgQXMgREFPLlJlY29yZHNldFR5cGVFbnVtID0gZGJPcGVu +Rm9yd2FyZE9ubHksIF8NCiAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5 +VmFsIFJlY29yZHNldE9wdGlvbnMgQXMgREFPLlJlY29yZHNldE9wdGlvbkVudW0g +PSBEQU8uUmVjb3Jkc2V0T3B0aW9uRW51bS5kYlNlZUNoYW5nZXMsIF8NCiAgICAg +ICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIExvY2tFZGl0IEFzIERBTy5M +b2NrVHlwZUVudW0gPSBEQU8uTG9ja1R5cGVFbnVtLmRiT3B0aW1pc3RpYykgQXMg +REFPLlJlY29yZHNldA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICANCiAgIElmIChSZWNvcmRzZXRPcHRpb25zIEFuZCBkYlNlZUNoYW5n +ZXMpID0gMCBUaGVuDQogICAgICBSZWNvcmRzZXRPcHRpb25zID0gUmVjb3Jkc2V0 +T3B0aW9ucyArIGRiU2VlQ2hhbmdlcw0KICAgRW5kIElmDQogICBTZXQgT3BlblJl +Y29yZHNldCA9IE1lLkN1cnJlbnREYkJFLk9wZW5SZWNvcmRzZXQoU291cmNlLCBS +ZWNvcmRzZXRUeXBlLCBSZWNvcmRzZXRPcHRpb25zLCBMb2NrRWRpdCkNCg0KRW5k +IEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NCicgRnVuY3Rpb246IE9wZW5SZWNvcmRzZXRQVA0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBPcGVuIFBhc3MgVGhy +b3VnaCBEQU8uUmVjb3Jkc2V0DQonDQonIFBhcmFtZXRlcnM6DQonICAgICBTb3Vy +Y2UgICAgICAgICAgICAtIFNRTCBzdGF0ZW1lbnQgb3IgdGFibGUgb3IgcXVlcnkg +bmFtZQ0KJyAgICAgUmVjb3Jkc2V0VHlwZSAgICAgLSBEQU8uUmVjb3Jkc2V0VHlw +ZUVudW0gKFN0YW5kYXJkOiBkYk9wZW5EeW5hc2V0KQ0KJyAgICAgUmVjb3Jkc2V0 +T3B0aW9ucyAgLSBEQU8uUmVjb3Jkc2V0T3B0aW9uRW51bSAoU3RhbmRhcmQ6IGRi +U2VlQ2hhbmdlcytkYlNRTFBhc3NUaHJvdWdoKQ0KJyAgICAgTG9ja0VkaXQgICAg +ICAgICAgLSBEQU8uTG9ja1R5cGVFbnVtIChTdGFuZGFyZDogZGJPcHRpbWlzdGlj +KQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgREFPLlJlY29yZHNldA0KJw0KJyBSZW1h +cmtzOg0KJyAgICAgVXNlcyA8Q3VycmVudERiQkU+IHRvIG9wZW4gdGhlIHJlY29y +ZHNldC4NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +ClB1YmxpYyBGdW5jdGlvbiBPcGVuUmVjb3Jkc2V0UFQoQnlWYWwgU291cmNlIEFz +IFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgUmVj +b3Jkc2V0VHlwZSBBcyBEQU8uUmVjb3Jkc2V0VHlwZUVudW0gPSBkYk9wZW5Gb3J3 +YXJkT25seSwgXw0KICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgUmVj +b3Jkc2V0T3B0aW9ucyBBcyBEQU8uUmVjb3Jkc2V0T3B0aW9uRW51bSA9IERBTy5S +ZWNvcmRzZXRPcHRpb25FbnVtLmRiU2VlQ2hhbmdlcyBPciBEQU8uUmVjb3Jkc2V0 +T3B0aW9uRW51bS5kYlNRTFBhc3NUaHJvdWdoLCBfDQogICAgICAgICAgICAgICAg +ICBPcHRpb25hbCBCeVZhbCBMb2NrRWRpdCBBcyBEQU8uTG9ja1R5cGVFbnVtID0g +REFPLkxvY2tUeXBlRW51bS5kYk9wdGltaXN0aWMpIEFzIERBTy5SZWNvcmRzZXQN +Cg0KICAgRGltIHFkZiBBcyBEQU8uUXVlcnlEZWYNCiAgIERpbSByc3QgQXMgREFP +LlJlY29yZHNldA0KDQogICBJZiAoUmVjb3Jkc2V0T3B0aW9ucyBBbmQgZGJTZWVD +aGFuZ2VzKSA9IDAgVGhlbg0KICAgICBSZWNvcmRzZXRPcHRpb25zID0gUmVjb3Jk +c2V0T3B0aW9ucyArIGRiU2VlQ2hhbmdlcw0KICAgRW5kIElmDQogICBJZiAoUmVj +b3Jkc2V0T3B0aW9ucyBBbmQgZGJTUUxQYXNzVGhyb3VnaCkgPSAwIFRoZW4NCiAg +ICAgUmVjb3Jkc2V0T3B0aW9ucyA9IFJlY29yZHNldE9wdGlvbnMgKyBkYlNRTFBh +c3NUaHJvdWdoDQogICBFbmQgSWYNCiAgIA0KICAgU2V0IHFkZiA9IE1lLkN1cnJl +bnREYi5DcmVhdGVRdWVyeURlZigiIikNCiAgIFdpdGggcWRmDQogICAgIC5Db25u +ZWN0ID0gTWUuQ29ubmVjdGlvblN0cmluZw0KICAgICAuT0RCQ1RpbWVvdXQgPSAw +DQogICAgIC5TUUwgPSBTb3VyY2UNCiAgICAgU2V0IHJzdCA9IC5PcGVuUmVjb3Jk +c2V0KFJlY29yZHNldFR5cGUsIFJlY29yZHNldE9wdGlvbnMsIExvY2tFZGl0KQ0K +ICAgICAuQ2xvc2UNCiAgIEVuZCBXaXRoDQoNCiAgIFNldCBPcGVuUmVjb3Jkc2V0 +UFQgPSByc3QNCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IEV4ZWN1dGUNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRXhlY3V0 +ZSBTUUwgc3RhdGVtZW50IChDdXJyZW50RGJCRS5FeGVjdXRlKQ0KJw0KJyBQYXJh +bWV0ZXJzOg0KJyAgICAgQ29tbWFuZFRleHQgLSBTUUwgc3RhdGVtZW50IChTdHJp +bmcpDQonICAgICBPcHRpb25zICAgICAtIERBTy5SZWNvcmRzZXRPcHRpb25FbnVt +DQonDQonIFJldHVybnM6DQonICAgICBSZWNvcmRzQWZmZWN0ZWQgKExvbmcpDQon +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJs +aWMgRnVuY3Rpb24gRXhlY3V0ZShCeVZhbCBDb21tYW5kVGV4dCBBcyBTdHJpbmcs +IF8NCiAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIE9wdGlvbnMgQXMgREFP +LlJlY29yZHNldE9wdGlvbkVudW0pIEFzIExvbmcNCg0KICAgRGltIGRiIEFzIERB +Ty5EYXRhYmFzZQ0KICAgDQogICBTZXQgZGIgPSBNZS5DdXJyZW50RGJCRQ0KDQog +ICBJZiAoT3B0aW9ucyBBbmQgZGJTZWVDaGFuZ2VzKSA9IDAgVGhlbg0KICAgICAg +T3B0aW9ucyA9IE9wdGlvbnMgKyBkYlNlZUNoYW5nZXMNCiAgIEVuZCBJZg0KICAg +ZGIuRXhlY3V0ZSBDb21tYW5kVGV4dCwgT3B0aW9ucw0KICAgRXhlY3V0ZSA9IGRi +LlJlY29yZHNBZmZlY3RlZA0KDQpFbmQgRnVuY3Rpb24NCg0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFN1YjogRXhlY3V0ZVBU +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tJw0KJyBF +eGVjdXRlIFNRTCBzdGF0ZW1lbnQgd2l0aCBQYXNzIFRyb3VnaCBRdWVyeQ0KJw0K +JyBQYXJhbWV0ZXJzOg0KJyAgICAgQ29tbWFuZFRleHQgLSBTUUwgc3RhdGVtZW50 +IChTdHJpbmcpDQonICAgICBPcHRpb25zICAgICAtIERBTy5SZWNvcmRzZXRPcHRp +b25FbnVtIChEZWZhdWx0OiBEQU8uUmVjb3Jkc2V0T3B0aW9uRW51bS5kYlNRTFBh +c3NUaHJvdWdoKQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgUmVjb3Jkc0FmZmVjdGVk +IChMb25nKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KUHVibGljIEZ1bmN0aW9uIEV4ZWN1dGVQVChCeVZhbCBDb21tYW5kVGV4 +dCBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwg +T3B0aW9ucyBBcyBEQU8uUmVjb3Jkc2V0T3B0aW9uRW51bSA9IERBTy5SZWNvcmRz +ZXRPcHRpb25FbnVtLmRiU1FMUGFzc1Rocm91Z2ggXw0KICAgICAgICAgICAgICAg +ICAgICAgICAgICkgQXMgTG9uZw0KICAgICAgICAgDQogICBEaW0gZGIgQXMgREFP +LkRhdGFiYXNlDQogICBEaW0gcWRmIEFzIERBTy5RdWVyeURlZg0KDQogICBJZiAo +T3B0aW9ucyBBbmQgZGJTUUxQYXNzVGhyb3VnaCkgPSAwIFRoZW4NCiAgICAgT3B0 +aW9ucyA9IE9wdGlvbnMgKyBkYlNRTFBhc3NUaHJvdWdoDQogICBFbmQgSWYNCiAg +IA0KICAgU2V0IGRiID0gTWUuQ3VycmVudERiDQogICBTZXQgcWRmID0gZGIuQ3Jl +YXRlUXVlcnlEZWYoIiIpDQogICBXaXRoIHFkZg0KICAgICAuQ29ubmVjdCA9IE1l +LkNvbm5lY3Rpb25TdHJpbmcNCiAgICAgLk9EQkNUaW1lb3V0ID0gMA0KICAgICAu +U1FMID0gQ29tbWFuZFRleHQNCiAgICAgLlJldHVybnNSZWNvcmRzID0gRmFsc2UN +CiAgICAgLkV4ZWN1dGUgT3B0aW9ucw0KICAgICAuQ2xvc2UNCiAgIEVuZCBXaXRo +DQogICANCiAgIEV4ZWN1dGVQVCA9IGRiLlJlY29yZHNBZmZlY3RlZA0KDQpFbmQg +RnVuY3Rpb24NCg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonIEZ1bmN0aW9uOiBMb29rdXBTUUwNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgTG9va3VwIERBTy5SZWNvcmRz +ZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIERMb29rdXAgKHBhc3NpbmcgYSBT +UUwgc3RhdGVtZW50KSB2aWEgQ3VycmVudERiQkUNCicNCicgUGFyYW1ldGVyczoN +CicgICAgIFNxbFRleHQgICAgIC0gU1FMIHN0YXRlbWVudA0KJyAgICAgSW5kZXgg +ICAgICAgLSBGaWVsZCBzZWxlY3Rpb24gaWYgdGhlIGZpcnN0IGZpZWxkIG9mIHRo +ZSByZWNvcmRzZXQgaXMgbm90IHRvIGJlIHJldHVybmVkLg0KJyAgICAgICAgICAg +ICAgICAgICBUaGUgaW5kZXggaXMgcGFzc2VkIGluIHRoZSBzYW1lIHdheSBhcyBB +RE9EQi5SZWNvcmRzZXQuRmllbGRzKGluZGV4KS4NCicgICAgIFZhbHVlSWZOdWxs +IC0gUmV0dXJuIHZhbHVlIGlmIHJlY29yZCBpcyBtaXNzaW5nIG9yIGRhdGEgZmll +bGQgdmFsdWUgaXMgTnVsbCAoZGVmYXVsdDogTnVsbCkuDQonDQonIFJldHVybnM6 +DQonICAgICBWYXJpYW50ICAtIE51bGwsIGlmIFNRTCBzdGF0ZW1lbnQgZG9lcyBu +b3QgcmV0dXJuIGEgcmVjb3JkLg0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIFNR +TCBzdGF0ZW1lbnQgbXVzdCBiZSB3cml0dGVuIGluIHRoZSBKZXQvQUNFIFNRTCBk +aWFsZWN0Lg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KUHVibGljIEZ1bmN0aW9uIExvb2t1cFNxbChCeVZhbCBTcWxUZXh0IEFz +IFN0cmluZywgXw0KICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBJbmRl +eCBBcyBWYXJpYW50ID0gMCYsIF8NCiAgICAgICAgICAgICAgICAgT3B0aW9uYWwg +QnlWYWwgVmFsdWVJZk51bGwgQXMgVmFyaWFudCA9IE51bGwpIEFzIFZhcmlhbnQN +Cg0KICAgRGltIHJzdCBBcyBEQU8uUmVjb3Jkc2V0DQoNCk9uIEVycm9yIEdvVG8g +SGFuZGxlRXJyDQoNCiAgIFNldCByc3QgPSBNZS5PcGVuUmVjb3Jkc2V0KFNxbFRl +eHQsIGRiT3BlbkZvcndhcmRPbmx5LCBkYlNlZUNoYW5nZXMsIGRiUmVhZE9ubHkp +DQogICBXaXRoIHJzdA0KICAgICAgSWYgLkVPRiBUaGVuDQogICAgICAgICBMb29r +dXBTcWwgPSBWYWx1ZUlmTnVsbA0KICAgICAgRWxzZQ0KICAgICAgICAgTG9va3Vw +U3FsID0gTnooLkZpZWxkcyhJbmRleCksIFZhbHVlSWZOdWxsKQ0KICAgICAgRW5k +IElmDQogICAgICAuQ2xvc2UNCiAgIEVuZCBXaXRoDQogICBTZXQgcnN0ID0gTm90 +aGluZw0KICAgDQpFeGl0SGVyZToNCiAgIEV4aXQgRnVuY3Rpb24NCiAgIA0KSGFu +ZGxlRXJyOg0KICAgSWYgTm90IChyc3QgSXMgTm90aGluZykgVGhlbg0KICAgICAg +cnN0LkNsb3NlDQogICAgICBTZXQgcnN0ID0gTm90aGluZw0KICAgRW5kIElmDQoN +CiAgIEVyci5SYWlzZSBFcnIuTnVtYmVyLCAiTG9va3VwU3FsUFQ6IiAmIEVyci5T +b3VyY2UsIEVyci5EZXNjcmlwdGlvbiwgRXJyLkhlbHBGaWxlLCBFcnIuSGVscENv +bnRleHQNCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IExvb2t1cFNxbFBUDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIExvb2t1 +cCBEQU8uUmVjb3Jkc2V0IHJlcGxhY2VtZW50IGZ1bmN0aW9uIGZvciBETG9va3Vw +IChwYXNzaW5nIGEgU1FMIHN0YXRlbWVudCkgdmlhIFBhc3MgVGhyb3VnaCBRdWVy +eQ0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgU3FsVGV4dCAgICAgLSBTUUwgc3Rh +dGVtZW50DQonICAgICBJbmRleCAgICAgICAtIEZpZWxkIHNlbGVjdGlvbiBpZiB0 +aGUgZmlyc3QgZmllbGQgb2YgdGhlIHJlY29yZHNldCBpcyBub3QgdG8gYmUgcmV0 +dXJuZWQuDQonICAgICAgICAgICAgICAgICAgIFRoZSBpbmRleCBpcyBwYXNzZWQg +aW4gdGhlIHNhbWUgd2F5IGFzIEFET0RCLlJlY29yZHNldC5GaWVsZHMoaW5kZXgp +Lg0KJyAgICAgVmFsdWVJZk51bGwgLSBSZXR1cm4gdmFsdWUgaWYgcmVjb3JkIGlz +IG1pc3Npbmcgb3IgZGF0YSBmaWVsZCB2YWx1ZSBpcyBOdWxsIChkZWZhdWx0OiBO +dWxsKS4NCicNCicgUmV0dXJuczoNCicgICAgIFZhcmlhbnQgIC0gTnVsbCwgaWYg +U1FMIHN0YXRlbWVudCBkb2VzIG5vdCByZXR1cm4gYSByZWNvcmQuDQonDQonIFJl +bWFya3M6DQonICAgICBUaGUgU1FMIHN0YXRlbWVudCBtdXN0IGJlIHdyaXR0ZW4g +aW4gdGhlIFNRTCBkaWFsZWN0IG9mIGJhY2tlbmQgKGUuIGcuIFQtU1FMIGZvciBT +UUwtU2VydmVyKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIExvb2t1cFNxbFBUKEJ5VmFsIFNxbFRl +eHQgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlW +YWwgSW5kZXggQXMgVmFyaWFudCA9IDAmLCBfDQogICAgICAgICAgICAgICAgICAg +T3B0aW9uYWwgQnlWYWwgVmFsdWVJZk51bGwgQXMgVmFyaWFudCA9IE51bGwpIEFz +IFZhcmlhbnQNCg0KICAgRGltIHJzdCBBcyBEQU8uUmVjb3Jkc2V0DQoNCk9uIEVy +cm9yIEdvVG8gSGFuZGxlRXJyDQoNCiAgIFNldCByc3QgPSBNZS5PcGVuUmVjb3Jk +c2V0UFQoU3FsVGV4dCwgZGJPcGVuRm9yd2FyZE9ubHksIGRiU2VlQ2hhbmdlcywg +ZGJSZWFkT25seSkNCiAgIFdpdGggcnN0DQogICAgICBJZiAuRU9GIFRoZW4NCiAg +ICAgICAgIExvb2t1cFNxbFBUID0gVmFsdWVJZk51bGwNCiAgICAgIEVsc2UNCiAg +ICAgICAgIExvb2t1cFNxbFBUID0gTnooLkZpZWxkcyhJbmRleCksIFZhbHVlSWZO +dWxsKQ0KICAgICAgRW5kIElmDQogICAgICAuQ2xvc2UNCiAgIEVuZCBXaXRoDQog +ICBTZXQgcnN0ID0gTm90aGluZw0KDQpFeGl0SGVyZToNCiAgIEV4aXQgRnVuY3Rp +b24NCiAgIA0KSGFuZGxlRXJyOg0KICAgSWYgTm90IChyc3QgSXMgTm90aGluZykg +VGhlbg0KICAgICAgcnN0LkNsb3NlDQogICAgICBTZXQgcnN0ID0gTm90aGluZw0K +ICAgRW5kIElmDQoNCiAgIEVyci5SYWlzZSBFcnIuTnVtYmVyLCAiTG9va3VwU3Fs +UFQ6IiAmIEVyci5Tb3VyY2UsIEVyci5EZXNjcmlwdGlvbiwgRXJyLkhlbHBGaWxl +LCBFcnIuSGVscENvbnRleHQNCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IExvb2t1 +cA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0K +JyBEQU8uUmVjb3Jkc2V0IHJlcGxhY2VtZW50IGZ1bmN0aW9uIGZvciBETG9va3Vw +ICh2aWEgQ3VycmVudERiQkUpDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBFeHBy +ICAgICAgICAtIEZpZWxkIG5hbWUgb3IgY2FsY3VsYXRlZCBleHByZXNzaW9uIChz +ZWxlY3QgcGFydCkNCicgICAgIERvbWFpbiAgICAgIC0gVGFibGUsIHF1ZXJ5IG9y +IFNRTCBleHByZXNzaW9uIGZvciBzdWItcXVlcnkgKEZST00gcGFydCkNCicgICAg +IENyaXRlcmlhICAgIC0gKE9wdGlvbmFsKSBDcml0ZXJpYSBzdHJpbmcgKFdIRVJF +IHBhcnQpDQonICAgICBWYWx1ZUlmTnVsbCAtIFJldHVybiB2YWx1ZSBpZiByZWNv +cmQgaXMgbWlzc2luZyBvciBkYXRhIGZpZWxkIHZhbHVlIGlzIE51bGwgKGRlZmF1 +bHQ6IE51bGwpLg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgVmFyaWFudA0KJw0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1 +bmN0aW9uIExvb2t1cChCeVZhbCBFeHByIEFzIFN0cmluZywgQnlWYWwgRG9tYWlu +IEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBDcml0 +ZXJpYSBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFs +IFZhbHVlSWZOdWxsIEFzIFZhcmlhbnQgPSBOdWxsKSBBcyBWYXJpYW50DQoNCiAg +IERpbSBTZWxlY3RTcWwgQXMgU3RyaW5nDQoNCiAgIFNlbGVjdFNxbCA9IEJ1aWxk +U2VsZWN0U3FsKEV4cHIsIERvbWFpbiwgQ3JpdGVyaWEsIEZhbHNlKQ0KICAgTG9v +a3VwID0gTG9va3VwU3FsKFNlbGVjdFNxbCwgLCBWYWx1ZUlmTnVsbCkNCg0KRW5k +IEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gQnVpbGRTZWxlY3RTcWwoQnlW +YWwgRXhwciBBcyBTdHJpbmcsIEJ5VmFsIERvbWFpbiBBcyBTdHJpbmcsIE9wdGlv +bmFsIEJ5VmFsIENyaXRlcmlhIEFzIFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAg +ICAgICAgICAgT3B0aW9uYWwgQnlWYWwgRGlzdGluY3QgQXMgQm9vbGVhbiA9IEZh +bHNlKQ0KDQogICBEaW0gU2VsZWN0U3FsIEFzIFN0cmluZw0KDQogICBTZWxlY3RT +cWwgPSAiU0VMRUNUICINCiAgIElmIERpc3RpbmN0IFRoZW4NCiAgICAgIFNlbGVj +dFNxbCA9IFNlbGVjdFNxbCAmICJEaXN0aW5jdCAiDQogICBFbmQgSWYNCiAgIFNl +bGVjdFNxbCA9IFNlbGVjdFNxbCAmIEV4cHIgJiAiIEZST00gKCIgJiBEb21haW4g +JiAiKSINCiAgIElmIE5vdCAoVmFyVHlwZShDcml0ZXJpYSkgPSB2YkVycm9yKSBU +aGVuDQogICAgICBJZiBMZW4oQ3JpdGVyaWEpID4gMCBUaGVuDQogICAgICAgICBT +ZWxlY3RTcWwgPSBTZWxlY3RTcWwgJiAiIFdIRVJFICIgJiBDcml0ZXJpYQ0KICAg +ICAgRW5kIElmDQogICBFbmQgSWYNCiAgIA0KICAgQnVpbGRTZWxlY3RTcWwgPSBT +ZWxlY3RTcWwNCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IENvdW50DQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIERBTy5SZWNv +cmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIERDb3VudCAodmlhIEN1cnJl +bnREYkJFKQ0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgRXhwciAgICAgICAgLSBG +aWVsZCBuYW1lIG9yIGNhbGN1bGF0ZWQgZXhwcmVzc2lvbiAoc2VsZWN0IHBhcnQp +DQonICAgICBEb21haW4gICAgICAtIFRhYmxlLCBxdWVyeSBvciBTUUwgZXhwcmVz +c2lvbiBmb3Igc3ViLXF1ZXJ5IChGUk9NIHBhcnQpDQonICAgICBDcml0ZXJpYSAg +ICAtIChvcHRpb25hbCkgQ3JpdGVyaWEgc3RyaW5nIChXSEVSRSBwYXJ0KQ0KJw0K +JyBSZXR1cm5zOg0KJyAgICAgTG9uZw0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIENvdW50KEJ5VmFs +IEV4cHIgQXMgU3RyaW5nLCBCeVZhbCBEb21haW4gQXMgU3RyaW5nLCBPcHRpb25h +bCBCeVZhbCBDcml0ZXJpYSBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAgT3B0 +aW9uYWwgQnlWYWwgRGlzdGluY3QgQXMgQm9vbGVhbiA9IEZhbHNlKSBBcyBMb25n +DQogICAgICAgICAgICAgDQogICBJZiBEaXN0aW5jdCBUaGVuDQogICAgICBJZiBF +eHByIDw+ICIqIiBUaGVuDQogICAgICAgICBEb21haW4gPSAiKCIgJiBCdWlsZFNl +bGVjdFNxbChFeHByLCBEb21haW4sIENyaXRlcmlhLCBUcnVlKSAmICIpIg0KICAg +ICAgICAgQ3JpdGVyaWEgPSB2Yk51bGxTdHJpbmcNCiAgICAgIEVuZCBJZg0KICAg +RW5kIElmDQogICAgICAgICAgICAgDQogICBDb3VudCA9IE56KE1lLkxvb2t1cCgi +Q291bnQoIiAmIEV4cHIgJiAiKSIsIERvbWFpbiwgQ3JpdGVyaWEpLCAwKQ0KICAg +DQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogTWF4DQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIERBTy5SZWNvcmRzZXQgcmVwbGFj +ZW1lbnQgZnVuY3Rpb24gZm9yIERNYXggKHZpYSBDdXJyZW50RGJCRSkNCicNCicg +UGFyYW1ldGVyczoNCicgICAgIEV4cHIgICAgICAgIC0gRmllbGQgbmFtZSBvciBj +YWxjdWxhdGVkIGV4cHJlc3Npb24gKHNlbGVjdCBwYXJ0KQ0KJyAgICAgRG9tYWlu +ICAgICAgLSBUYWJsZSwgcXVlcnkgb3IgU1FMIGV4cHJlc3Npb24gZm9yIHN1Yi1x +dWVyeSAoRlJPTSBwYXJ0KQ0KJyAgICAgQ3JpdGVyaWEgICAgLSAoT3B0aW9uYWwp +IENyaXRlcmlhIHN0cmluZyAoV0hFUkUgcGFydCkNCicNCicgUmV0dXJuczoNCicg +ICAgIFZhcmlhbnQNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBNYXgoQnlWYWwgRXhwciBBcyBTdHJp +bmcsIEJ5VmFsIERvbWFpbiBBcyBTdHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRl +cmlhIEFzIFZhcmlhbnQpIEFzIFZhcmlhbnQNCiAgIE1heCA9IE1lLkxvb2t1cCgi +TWF4KCIgJiBFeHByICYgIikiLCBEb21haW4sIENyaXRlcmlhKQ0KRW5kIEZ1bmN0 +aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicgRnVuY3Rpb246IE1pbg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJw0KJyBEQU8uUmVjb3Jkc2V0IHJlcGxhY2VtZW50IGZ1bmN0 +aW9uIGZvciBETWluICh2aWEgQ3VycmVudERiQkUpDQonDQonIFBhcmFtZXRlcnM6 +DQonICAgICBFeHByICAgICAgICAtIEZpZWxkIG5hbWUgb3IgY2FsY3VsYXRlZCBl +eHByZXNzaW9uIChzZWxlY3QgcGFydCkNCicgICAgIERvbWFpbiAgICAgIC0gVGFi +bGUsIHF1ZXJ5IG9yIFNRTCBleHByZXNzaW9uIGZvciBzdWItcXVlcnkgKEZST00g +cGFydCkNCicgICAgIENyaXRlcmlhICAgIC0gKE9wdGlvbmFsKSBDcml0ZXJpYSBz +dHJpbmcgKFdIRVJFIHBhcnQpDQonDQonIFJldHVybnM6DQonICAgICBWYXJpYW50 +DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQ +dWJsaWMgRnVuY3Rpb24gTWluKEJ5VmFsIEV4cHIgQXMgU3RyaW5nLCBCeVZhbCBE +b21haW4gQXMgU3RyaW5nLCBPcHRpb25hbCBCeVZhbCBDcml0ZXJpYSBBcyBWYXJp +YW50KSBBcyBWYXJpYW50DQogICAgTWluID0gTWUuTG9va3VwKCJNaW4oIiAmIEV4 +cHIgJiAiKSIsIERvbWFpbiwgQ3JpdGVyaWEpDQpFbmQgRnVuY3Rpb24NCg0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlv +bjogU3VtDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQonDQonIERBTy5SZWNvcmRzZXQgcmVwbGFjZW1lbnQgZnVuY3Rpb24gZm9yIERT +dW0gKHZpYSBDdXJyZW50RGJCRSkNCicNCicgUGFyYW1ldGVyczoNCicgICAgIEV4 +cHIgICAgICAgIC0gRmllbGQgbmFtZSBvciBjYWxjdWxhdGVkIGV4cHJlc3Npb24g +KHNlbGVjdCBwYXJ0KQ0KJyAgICAgRG9tYWluICAgICAgLSBUYWJsZSwgcXVlcnkg +b3IgU1FMIGV4cHJlc3Npb24gZm9yIHN1Yi1xdWVyeSAoRlJPTSBwYXJ0KQ0KJyAg +ICAgQ3JpdGVyaWEgICAgLSAoT3B0aW9uYWwpIENyaXRlcmlhIHN0cmluZyAoV0hF +UkUgcGFydCkNCicNCicgUmV0dXJuczoNCicgICAgIFZhcmlhbnQNCicNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5j +dGlvbiBTdW0oQnlWYWwgRXhwciBBcyBTdHJpbmcsIEJ5VmFsIERvbWFpbiBBcyBT +dHJpbmcsIE9wdGlvbmFsIEJ5VmFsIENyaXRlcmlhIEFzIFZhcmlhbnQpIEFzIFZh +cmlhbnQNCiAgIFN1bSA9IE1lLkxvb2t1cCgiU3VtKCIgJiBFeHByICYgIikiLCBE +b21haW4sIENyaXRlcmlhKQ0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IEluc2VydElk +ZW50aXR5UmV0dXJuDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonDQonIEV4ZWN1dGUgaW5zZXJ0IFNRTCBzdGF0ZW1lbnQgYW5kIHJl +dHVybiBsYXN0IGlkZW50aXR5IHZhbHVlICh2aWEgQ3VycmVudERiQkUpDQonDQon +IFBhcmFtZXRlcnM6DQonICAgICBJbnNlcnRTUUwgICAtIEluc2VydCBTUUwgc3Rh +dGVtZW50DQonDQonIFJldHVybnM6DQonICAgICBJZGVudGl0eSB2YWx1ZSBvciBO +VUxMIGlmIG5vIHJlY29yZCB3YXMgYXBwZW5kZWQNCicNCicgUmVtYXJrczoNCicg +ICAgIFdvcmtzIGZvciBKZXQgb25seSBmcm9tIEpldCA0LjAgKEFjY2VzcyAyMDAw +KSwgSWRlbnRpdHlUYWJsZSBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIE1TU1FMLCB1 +bmRlciBNeVNRTCB0aGUgSURFTlRfQ1VSUkVOVCBmdW5jdGlvbiBkb2VzIG5vdCBl +eGlzdC4NCicgICAgIElmIEhvb2tzRW5hYmxlZDogZXZlbnQgSG9va0luc2VydElk +ZW50aXR5UmV0dXJuIHdpbGwgYmUgcmFpc2VkDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gSW5zZXJ0SWRl +bnRpdHlSZXR1cm4oQnlWYWwgSW5zZXJ0U1FMIEFzIFN0cmluZykgQXMgVmFyaWFu +dA0KDQogICBEaW0gZGIgQXMgREFPLkRhdGFiYXNlDQogICBEaW0gcnN0IEFzIERB +Ty5SZWNvcmRzZXQNCiAgIERpbSBSZWNvcmRzQWZmZWN0ZWQgQXMgTG9uZw0KICAg +RGltIElkZW50aXR5U3FsIEFzIFN0cmluZw0KICAgRGltIEhvb2tSZXNwb25zZU1v +ZGUgQXMgTG9uZw0KICAgRGltIEhvb2tSZXNwb25zZU1lc3NhZ2UgQXMgVmFyaWFu +dA0KDQogICBTZXQgZGIgPSBNZS5DdXJyZW50RGJCRQ0KICAgDQogICBJZiBtX0hv +b2tzRW5hYmxlZCBUaGVuDQogICAgICBSYWlzZUV2ZW50IEhvb2tJbnNlcnRJZGVu +dGl0eVJldHVybihJbnNlcnRTUUwsIGRiLCBJZGVudGl0eVNxbCwgSG9va1Jlc3Bv +bnNlTW9kZSwgSG9va1Jlc3BvbnNlTWVzc2FnZSkNCiAgICAgIElmIEhvb2tSZXNw +b25zZU1vZGUgPD4gMCBUaGVuICdIb29rIGVybWl0dGVsdGUgYmVyZWl0cyBkYXMg +RXJnZWJuaXMNCiAgICAgICAgIEluc2VydElkZW50aXR5UmV0dXJuID0gSG9va1Jl +c3BvbnNlTWVzc2FnZQ0KICAgICAgICAgRXhpdCBGdW5jdGlvbg0KICAgICAgRW5k +IElmDQogICBFbmQgSWYNCiAgIA0KT24gRXJyb3IgR29UbyBIYW5kbGVFcnINCg0K +ICAgZGIuRXhlY3V0ZSBJbnNlcnRTUUwsIGRiRmFpbE9uRXJyb3INCiAgIFJlY29y +ZHNBZmZlY3RlZCA9IGRiLlJlY29yZHNBZmZlY3RlZA0KICAgDQogICBJZiBSZWNv +cmRzQWZmZWN0ZWQgPSAwIFRoZW4NCiAgICAgIEluc2VydElkZW50aXR5UmV0dXJu +ID0gTnVsbCAnZXMgd3VyZGUga2VpbiBuZXVlciBEUyBhbmdlZvxndA0KICAgICAg +RXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIElmIExlbihJZGVudGl0 +eVNxbCkgPSAwIFRoZW4NCiAgICAgIElkZW50aXR5U3FsID0gIlNFTEVDVCBAQElk +ZW50aXR5Ig0KICAgRW5kIElmDQoNCiAgIFNldCByc3QgPSBkYi5PcGVuUmVjb3Jk +c2V0KElkZW50aXR5U3FsKSAnenVsZXR6dCB6dWdld2llc2VuZXIgQXV0b3dlcnQg +LyAuLi4gZnVua3Rpb25pZXJ0IG5pY2h0IGJlaSBNeVNRTCENCiAgIFdpdGggcnN0 +DQogICAgICBJZiAuRU9GIFRoZW4NCiAgICAgICAgIEluc2VydElkZW50aXR5UmV0 +dXJuID0gTnVsbA0KICAgICAgRWxzZQ0KICAgICAgICAgSW5zZXJ0SWRlbnRpdHlS +ZXR1cm4gPSAuRmllbGRzKDApDQogICAgICBFbmQgSWYNCiAgICAgIC5DbG9zZQ0K +ICAgRW5kIFdpdGgNCiAgIFNldCByc3QgPSBOb3RoaW5nDQogICBTZXQgZGIgPSBO +b3RoaW5nDQogICAgDQpFeGl0SGVyZToNCiAgIEV4aXQgRnVuY3Rpb24NCg0KSGFu +ZGxlRXJyOg0KICAgSWYgTm90IChyc3QgSXMgTm90aGluZykgVGhlbg0KICAgICAg +cnN0LkNsb3NlDQogICAgICBTZXQgcnN0ID0gTm90aGluZw0KICAgRW5kIElmDQoN +CiAgIEVyci5SYWlzZSBFcnIuTnVtYmVyLCAiSW5zZXJ0SWRlbnRpdHlSZXR1cm46 +IiAmIEVyci5Tb3VyY2UsIEVyci5EZXNjcmlwdGlvbiwgRXJyLkhlbHBGaWxlLCBF +cnIuSGVscENvbnRleHQNCg0KRW5kIEZ1bmN0aW9uDQoNCicjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +DQonIEdyb3VwOiBMaW5rZWQgVGFibGUgU3VwcG9ydA0KDQonLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFN1YjogTGlua1RhYmxlDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIExp +bmsgYmFja2VuZCB0YWJsZSBpbiBBY2Nlc3MgZnJvbnRlbmQNCicNCicgUGFyYW1l +dGVyczoNCicgICAgIFNvdXJjZVRhYmxlTmFtZSAgIC0gVGFibGUgb3IgdmlldyBp +biB0aGUgYmFja2VuZA0KJyAgICAgTGlua2VkVGFibGVOYW1lICAgLSBUYWJsZSBp +biBmcm9udGVuZA0KJyAgICAgU2F2ZVBXRCAgICAgICAgICAgLSBTYXZlIE9EQkMg +cGFzc3dvcmQgaW4gbGlua2VkIHRhYmxlDQonICAgICBSZW1vdmVTY2hlbWFOYW1l +ICAtIFJlbW92ZSBzY2hlbWEgaWRlbnRpZmllcg0KJw0KJyBSZW1hcmtzOg0KJyAg +ICAgSWYgdGhlcmUgaXMgYSAyLXBhcnQgdGFibGUgaWRlbnRpZmllciBsaWtlICJk +Ym8uVGFibGUxMjMiIGluIHRoZSBCRSBhbmQgYlJlbW92ZVNjaGVtYU5hbWUgaXMg +c2V0IHRvIGZhbHNlLCB0aGUgZG90IGlzIHJlcGxhY2VkIGJ5ICJfIi4NCicNCict +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBT +dWIgTGlua1RhYmxlKEJ5VmFsIFNvdXJjZVRhYmxlTmFtZSBBcyBTdHJpbmcsIF8N +CiAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIExpbmtlZFRhYmxlTmFtZSBBcyBT +dHJpbmcgPSB2Yk51bGxTdHJpbmcsIF8NCiAgICAgICAgICAgIE9wdGlvbmFsIEJ5 +VmFsIFNhdmVQV0QgQXMgQm9vbGVhbiA9IEZhbHNlLCBfDQogICAgICAgICAgICBP +cHRpb25hbCBCeVZhbCBSZW1vdmVTY2hlbWFOYW1lIEFzIEJvb2xlYW4gPSBUcnVl +KQ0KDQogICBEaW0gZGJzIEFzIERBTy5EYXRhYmFzZQ0KICAgRGltIHRkZiBBcyBE +QU8uVGFibGVEZWYNCiAgIERpbSBQb3MgQXMgTG9uZw0KICAgRGltIE5ld0Nvbm5l +Y3Rpb25TdHJpbmcgQXMgU3RyaW5nDQogICANCiAgIE5ld0Nvbm5lY3Rpb25TdHJp +bmcgPSBNZS5Db25uZWN0aW9uU3RyaW5nDQogICBJZiBMZW4oTmV3Q29ubmVjdGlv +blN0cmluZykgPSAwIFRoZW4NCiAgICAgIEVyci5SYWlzZSBFUlJOUl9OT0NPTkZJ +RywgXw0KICAgICAgICAgICAgICAiTGlua1RhYmxlIiwgIk1pc3NpbmcgT0RCQyBj +b25uZWN0aW9uIHN0cmluZyEiDQogICBFbmQgSWYNCiAgIA0KICAgSWYgTGVuKExp +bmtlZFRhYmxlTmFtZSkgPSAwIFRoZW4NCiAgICAgIExpbmtlZFRhYmxlTmFtZSA9 +IFNvdXJjZVRhYmxlTmFtZQ0KICAgICAgSWYgUmVtb3ZlU2NoZW1hTmFtZSBUaGVu +DQogICAgICAgICBQb3MgPSBJblN0cigxLCBMaW5rZWRUYWJsZU5hbWUsICIuIikN +CiAgICAgICAgIElmIFBvcyA+IDAgVGhlbg0KICAgICAgICAgICAgTGlua2VkVGFi +bGVOYW1lID0gTWlkJChMaW5rZWRUYWJsZU5hbWUsIFBvcyArIDEpICcgdXNlIG9u +bHkgdGV4dCBhZnRlciBwb2ludA0KICAgICAgICAgRW5kIElmDQogICAgICBFbmQg +SWYNCiAgICAgIExpbmtlZFRhYmxlTmFtZSA9IFJlcGxhY2UoTGlua2VkVGFibGVO +YW1lLCAiLiIsICJfIikNCiAgIEVuZCBJZg0KICAgDQogICBTZXQgZGJzID0gTWUu +Q3VycmVudERiDQogICBkYnMuVGFibGVEZWZzLlJlZnJlc2gNCiAgICdDaGVjayBp +ZiB0YWJsZSBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbGlua2VkLg0KJyBUT0RPOiBy +ZWZhY3RvciBmb3ItZWFjaA0KICAgRm9yIEVhY2ggdGRmIEluIGRicy5UYWJsZURl +ZnMNCiAgICAgIElmIHRkZi5OYW1lID0gTGlua2VkVGFibGVOYW1lIFRoZW4NCiAg +ICAgICAgIElmIHRkZi5Tb3VyY2VUYWJsZU5hbWUgPSBTb3VyY2VUYWJsZU5hbWUg +VGhlbg0KICAgICAgICAgICAgUmVsaW5rVGFibGVEZWYgdGRmLCBOZXdDb25uZWN0 +aW9uU3RyaW5nLCBTYXZlUFdEDQogICAgICAgICAgICBFeGl0IFN1Yg0KICAgICAg +ICAgRWxzZQ0KICAgICAgICAgICAgSWYgTXNnQm94KCJUaGUgU291cmNlVGFibGVO +YW1lIG9mIHRoZSBleGlzdGluZyB0YWJsZSAnIiAmIExpbmtlZFRhYmxlTmFtZSAm +ICInIGlzICciICYgdGRmLlNvdXJjZVRhYmxlTmFtZSAmICInIGFuZCBub3QgJyIg +JiBTb3VyY2VUYWJsZU5hbWUgJiAiJyIgJiB2Yk5ld0xpbmUgJiBfDQogICAgICAg +ICAgICAgICAgICAgICAgIlNob3VsZCB0aGUgZXhpc3RpbmcgdGFibGUgYmUgbGlu +a2VkIHRvIHRoZSBuZXcgZGF0YSBvcmlnaW4/IiwgdmJDcml0aWNhbCArIHZiWWVz +Tm8gKyB2YkRlZmF1bHRCdXR0b24yKSA9IHZiWWVzIFRoZW4NCiAgICAgICAgICAg +ICAgIGRicy5UYWJsZURlZnMuRGVsZXRlIHRkZi5OYW1lDQogICAgICAgICAgICBF +bHNlDQogICAgICAgICAgICAgICBFeGl0IFN1Yg0KICAgICAgICAgICAgRW5kIElm +DQogICAgICAgICBFbmQgSWYNCiAgICAgICAgIEV4aXQgRm9yDQogICAgICBFbmQg +SWYNCiAgIE5leHQgdGRmDQoNCiAgIFNldCB0ZGYgPSBkYnMuQ3JlYXRlVGFibGVE +ZWYoTGlua2VkVGFibGVOYW1lKQ0KICAgdGRmLlNvdXJjZVRhYmxlTmFtZSA9IFNv +dXJjZVRhYmxlTmFtZQ0KICAgdGRmLkNvbm5lY3QgPSBOZXdDb25uZWN0aW9uU3Ry +aW5nDQogICBkYnMuVGFibGVEZWZzLkFwcGVuZCB0ZGYNCiAgIElmIFNhdmVQV0Qg +VGhlbg0KICAgICAgQWRkVGFibGVEZWZBdHRyaWJ1dCB0ZGYsIGRiQXR0YWNoU2F2 +ZVBXRA0KICAgICAgdGRmLlJlZnJlc2hMaW5rDQogICBFbmQgSWYNCiAgIA0KICAg +U2V0IHRkZiA9IE5vdGhpbmcNCiAgIGRicy5UYWJsZURlZnMuUmVmcmVzaA0KICAg +U2V0IGRicyA9IE5vdGhpbmcNCg0KRW5kIFN1Yg0KDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBSZWxpbmtUYWJs +ZXMNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicN +CicgUmVsaW5rIGV4aXN0aW5nIHRhYmxlcw0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAg +ICAgU2F2ZVBXRCAgICAgLSBTYXZlIE9EQkMgcGFzc3dvcmQgaW4gbGlua2VkIHRh +YmxlDQonICAgICBFdmVudFBlcmlvZCAtIE51bWJlciBvZiBsaW5rZWQgZWxlbWVu +dHMgd2hlbiB0aGUgRGJPYmplY3RSZWxpbmtlZCBldmVudCBpcyB0byBiZSBjYWxs +ZWQuIChEZWZhdWx0OiAwIC4uLiBubyBldmVudCBjYWxsKS4NCicNCicgUmV0dXJu +czoNCicgICAgIExvbmcgIC0gTnVtYmVyIG9mIGxpbmtlZCB0YWJsZXMNCicNCict +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBG +dW5jdGlvbiBSZWxpbmtUYWJsZXMoT3B0aW9uYWwgQnlWYWwgU2F2ZVBXRCBBcyBC +b29sZWFuID0gRmFsc2UsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +T3B0aW9uYWwgQnlWYWwgRXZlbnRQZXJpb2QgQXMgTG9uZyA9IDApIEFzIExvbmcN +CidFdmVudFBlcmlvZCA9IDAgLi4uIFJldHVybiBpcyBkaXNhYmxlZA0KDQogICBE +aW0gTmV3Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcNCiAgIERpbSBSZWxpbmtl +ZEl0ZW1DbnQgQXMgTG9uZw0KDQogICBOZXdDb25uZWN0aW9uU3RyaW5nID0gTWUu +Q29ubmVjdGlvblN0cmluZw0KICAgSWYgTGVuKE5ld0Nvbm5lY3Rpb25TdHJpbmcp +ID0gMCBUaGVuDQogICAgICBFcnIuUmFpc2UgRVJSTlJfTk9DT05GSUcsIF8NCiAg +ICAgICAgICAgICAgIlJlbGlua1RhYmxlIiwgIk1pc3NpbmcgT0RCQyBjb25uZWN0 +aW9uIHN0cmluZyEiDQogICBFbmQgSWYNCiAgIA0KICAgUmVsaW5rVGFibGVzV29y +a2VyIE5ld0Nvbm5lY3Rpb25TdHJpbmcsIFNhdmVQV0QsIEV2ZW50UGVyaW9kLCBS +ZWxpbmtlZEl0ZW1DbnQNCiAgIA0KICAgUmVsaW5rVGFibGVzID0gUmVsaW5rZWRJ +dGVtQ250DQoNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIFN1YiBSZWxpbmtUYWJs +ZXNXb3JrZXIoQnlWYWwgTmV3Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcsIF8N +CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBTYXZlUFdEIEFz +IEJvb2xlYW4sIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZh +bCBFdmVudFBlcmlvZCBBcyBMb25nLCBfDQogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgQnlSZWYgUmVsaW5rZWRUYWJsZUNvdW50ZXIgQXMgTG9uZykNCidF +dmVudFBlcmlvZCA9IDAgLi4uIFJldHVybiBpcyBkaXNhYmxlZA0KDQogICBEaW0g +ZGJzIEFzIERBTy5EYXRhYmFzZQ0KICAgRGltIHRkZiBBcyBEQU8uVGFibGVEZWYN +CiAgIERpbSBMYXN0VGRmTmFtZSBBcyBTdHJpbmcNCiAgIA0KICAgU2V0IGRicyA9 +IE1lLkN1cnJlbnREYg0KICAgZGJzLlRhYmxlRGVmcy5SZWZyZXNoDQogICANCiAg +IEZvciBFYWNoIHRkZiBJbiBkYnMuVGFibGVEZWZzDQogICANCiAgICAgIElmIFJl +bGlua1RhYmxlRGVmKHRkZiwgTmV3Q29ubmVjdGlvblN0cmluZywgU2F2ZVBXRCkg +VGhlbg0KICAgICAgICAgUmVsaW5rZWRUYWJsZUNvdW50ZXIgPSBSZWxpbmtlZFRh +YmxlQ291bnRlciArIDENCiAgICAgICAgIElmIEV2ZW50UGVyaW9kID4gMCBUaGVu +DQogICAgICAgICAgICBMYXN0VGRmTmFtZSA9IHRkZi5OYW1lDQogICAgICAgICAg +ICBJZiBSZWxpbmtlZFRhYmxlQ291bnRlciBNb2QgRXZlbnRQZXJpb2QgPSAwIFRo +ZW4NCiAgICAgICAgICAgICAgIFJhaXNlRXZlbnQgRGJPYmplY3RSZWxpbmtlZChM +YXN0VGRmTmFtZSwgUmVsaW5rZWRUYWJsZUNvdW50ZXIpDQogICAgICAgICAgICBF +bmQgSWYNCiAgICAgICAgIEVuZCBJZg0KICAgICAgRW5kIElmDQogICANCiAgIE5l +eHQgdGRmDQogICANCiAgIElmIEV2ZW50UGVyaW9kID4gMCBUaGVuDQogICAgICBJ +ZiBSZWxpbmtlZFRhYmxlQ291bnRlciBNb2QgRXZlbnRQZXJpb2QgPiAwIFRoZW4N +CiAgICAgICAgIFJhaXNlRXZlbnQgRGJPYmplY3RSZWxpbmtlZChMYXN0VGRmTmFt +ZSwgUmVsaW5rZWRUYWJsZUNvdW50ZXIpDQogICAgICBFbmQgSWYNCiAgIEVuZCBJ +Zg0KDQpFbmQgU3ViDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicgU3ViOiBSZWxpbmtUYWJsZQ0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBSZWxpbmsgbGlua2VkIHRhYmxl +IHdpdGggcG9zc2libGUgY2hhbmdlIG9mIHNlcnZlciBkYXRhDQonDQonIFBhcmFt +ZXRlcnM6DQonICAgICBMaW5rZWRUYWJsZU5hbWUgICAtIFRhYmxlIGluIGZyb250 +ZW5kDQonICAgICBTYXZlUFdEICAgICAgICAgICAtIFNhdmUgT0RCQyBwYXNzd29y +ZCBpbiBsaW5rZWQgdGFibGUNCicNCicgUmV0dXJuczoNCicgICAgIEJvb2xlYW4g +IC0gc3VjY2Vzcw0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVGhlIFRhYmxlRGVmIHBy +b3BlcnR5IFNvdXJjZVRhYmxlTmFtZSBpcyBub3QgY2hhbmdlZC4NCicNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5j +dGlvbiBSZWxpbmtUYWJsZShCeVZhbCBMaW5rZWRUYWJsZU5hbWUgQXMgU3RyaW5n +LCBfDQogICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgU2F2ZVBXRCBB +cyBCb29sZWFuID0gRmFsc2UpIEFzIEJvb2xlYW4NCg0KICAgRGltIGRicyBBcyBE +QU8uRGF0YWJhc2UNCiAgIERpbSB0ZGYgQXMgREFPLlRhYmxlRGVmDQogICBEaW0g +TmV3Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcNCiAgIA0KICAgTmV3Q29ubmVj +dGlvblN0cmluZyA9IE1lLkNvbm5lY3Rpb25TdHJpbmcNCiAgIElmIExlbihOZXdD +b25uZWN0aW9uU3RyaW5nKSA9IDAgVGhlbg0KICAgICAgRXJyLlJhaXNlIEVSUk5S +X05PQ09ORklHLCBfDQogICAgICAgICAgICAgICJSZWxpbmtUYWJsZSIsICJNaXNz +aW5nIE9EQkMgY29ubmVjdGlvbiBzdHJpbmchIg0KICAgRW5kIElmDQoNCiAgIFNl +dCBkYnMgPSBNZS5DdXJyZW50RGINCiAgIGRicy5UYWJsZURlZnMuUmVmcmVzaA0K +ICAgU2V0IHRkZiA9IGRicy5UYWJsZURlZnMoTGlua2VkVGFibGVOYW1lKQ0KICAg +UmVsaW5rVGFibGUgPSBSZWxpbmtUYWJsZURlZih0ZGYsIE5ld0Nvbm5lY3Rpb25T +dHJpbmcsIFNhdmVQV0QpDQoNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0 +aW9uIFJlbGlua1RhYmxlRGVmKEJ5VmFsIFRkZlJlZiBBcyBEQU8uVGFibGVEZWYs +IF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlWYWwgTmV3Q29u +bmVjdGlvblN0cmluZyBBcyBTdHJpbmcsIF8NCiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgQnlWYWwgU2F2ZVBXRCBBcyBTdHJpbmcpIEFzIEJvb2xlYW4N +CiAgIA0KICAgSWYgTm90IElzTGlua2VkVGFibGUoVGRmUmVmKSBUaGVuDQogICAg +ICBSZWxpbmtUYWJsZURlZiA9IEZhbHNlDQogICAgICBFeGl0IEZ1bmN0aW9uDQog +ICBFbmQgSWYNCiAgIA0KICAgV2l0aCBUZGZSZWYNCiAgIA0KICAgICAgSWYgTGVm +dCguQ29ubmVjdCwgNSkgPD4gIk9EQkM7IiBUaGVuIEV4aXQgRnVuY3Rpb24NCiAg +IA0KICAgICAgLkNvbm5lY3QgPSBOZXdDb25uZWN0aW9uU3RyaW5nDQogICAgICAu +UmVmcmVzaExpbmsNCiAgICAgIA0KICAgICAgSWYgU2F2ZVBXRCBUaGVuDQogICAg +ICAgICBBZGRUYWJsZURlZkF0dHJpYnV0IFRkZlJlZiwgZGJBdHRhY2hTYXZlUFdE +DQogICAgICBFbHNlDQogICAgICAgICBSZW1vdmVUYWJsZURlZkF0dHJpYnV0IFRk +ZlJlZiwgZGJBdHRhY2hTYXZlUFdEDQogICAgICBFbmQgSWYNCiAgIEVuZCBXaXRo +DQogICANCiAgIFJlbGlua1RhYmxlRGVmID0gVHJ1ZQ0KICAgDQpFbmQgRnVuY3Rp +b24NCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +JyBGdW5jdGlvbjogUmVsaW5rUGFzc1Rocm91Z2hRdWVyaWVzDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEFsbGUgUGFzcy1U +aHJvdWdoLUFiZnJhZ2VuIG5ldSB2ZXJrbvxwZmVuDQonDQonIFBhcmFtZXRlcnM6 +DQonICAgICBTYXZlUFdEICAgICAtIFNhdmUgT0RCQyBwYXNzd29yZCBpbiBsaW5r +ZWQgdGFibGUNCicgICAgIEV2ZW50UGVyaW9kIC0gTnVtYmVyIG9mIGxpbmtlZCBl +bGVtZW50cyB3aGVuIHRoZSBEYk9iamVjdFJlbGlua2VkIGV2ZW50IGlzIHRvIGJl +IGNhbGxlZC4gKERlZmF1bHQ6IDAgLi4uIG5vIGV2ZW50IGNhbGwpLg0KJw0KJyBS +ZXR1cm5zOg0KJyAgICAgTG9uZyAgICAgICAgLSBOdW1iZXIgb2YgbGlua2VkIHBh +c3MgdGhyb3VnaCBxdWVyaWVzDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gUmVsaW5rUGFzc1Rocm91 +Z2hRdWVyaWVzKE9wdGlvbmFsIEJ5VmFsIFNhdmVQV0QgQXMgQm9vbGVhbiA9IEZh +bHNlLCBfDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IE9wdGlvbmFsIEJ5VmFsIEV2ZW50UGVyaW9kIEFzIExvbmcgPSAwKSBBcyBMb25n +DQonRXZlbnRQZXJpb2QgPSAwIC4uLiBSZXR1cm4gaXMgZGlzYWJsZWQNCg0KICAg +RGltIE5ld0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nDQogICBEaW0gUmVsaW5r +ZWRJdGVtcyBBcyBMb25nDQoNCiAgIE5ld0Nvbm5lY3Rpb25TdHJpbmcgPSBNZS5D +b25uZWN0aW9uU3RyaW5nDQogICBJZiBMZW4oTmV3Q29ubmVjdGlvblN0cmluZykg +PSAwIFRoZW4NCiAgICAgIEVyci5SYWlzZSBFUlJOUl9OT0NPTkZJRywgXw0KICAg +ICAgICAgICAgICAiUmVsaW5rVGFibGUiLCAiTWlzc2luZyBPREJDIGNvbm5lY3Rp +b24gc3RyaW5nISINCiAgIEVuZCBJZg0KICAgDQogICBSZWxpbmtQYXNzVGhyb3Vn +aFF1ZXJpZXNXb3JrZXIgTmV3Q29ubmVjdGlvblN0cmluZywgU2F2ZVBXRCwgRXZl +bnRQZXJpb2QsIFJlbGlua2VkSXRlbXMNCiAgIA0KICAgUmVsaW5rUGFzc1Rocm91 +Z2hRdWVyaWVzID0gUmVsaW5rZWRJdGVtcw0KDQpFbmQgRnVuY3Rpb24NCg0KUHJp +dmF0ZSBTdWIgUmVsaW5rUGFzc1Rocm91Z2hRdWVyaWVzV29ya2VyKEJ5VmFsIE5l +d0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBTYXZlUFdEIEFzIEJvb2xl +YW4sIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +IEJ5VmFsIEV2ZW50UGVyaW9kIEFzIExvbmcsIF8NCiAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVmIFJlbGlua0NvdW50ZXIgQXMg +TG9uZykNCidFdmVudFBlcmlvZCA9IDAgLi4uIFJldHVybiBpcyBkaXNhYmxlZA0K +ICAgDQogICBEaW0gZGJzIEFzIERBTy5EYXRhYmFzZQ0KICAgRGltIHFkZiBBcyBE +QU8uUXVlcnlEZWYNCiAgIERpbSBMYXN0UWRmTmFtZSBBcyBTdHJpbmcNCiAgIA0K +ICAgU2V0IGRicyA9IE1lLkN1cnJlbnREYg0KICAgZGJzLlF1ZXJ5RGVmcy5SZWZy +ZXNoDQogICANCiAgIElmIE5vdCBTYXZlUFdEIFRoZW4NCiAgICAgIE5ld0Nvbm5l +Y3Rpb25TdHJpbmcgPSBSZW1vdmVQYXNzd29yZEZyb21Db25uZWN0aW9uU3RyaW5n +KE5ld0Nvbm5lY3Rpb25TdHJpbmcpDQogICBFbmQgSWYNCiAgIA0KICAgRm9yIEVh +Y2ggcWRmIEluIGRicy5RdWVyeURlZnMNCiAgICAgIElmIFJlbGlua1Bhc3NUaHJv +dWdoUXVlcnlEZWYocWRmLCBOZXdDb25uZWN0aW9uU3RyaW5nKSBUaGVuDQogICAg +ICAgICBSZWxpbmtDb3VudGVyID0gUmVsaW5rQ291bnRlciArIDENCiAgICAgICAg +IElmIEV2ZW50UGVyaW9kID4gMCBUaGVuDQogICAgICAgICAgICBMYXN0UWRmTmFt +ZSA9IHFkZi5OYW1lDQogICAgICAgICAgICBJZiBSZWxpbmtDb3VudGVyIE1vZCBF +dmVudFBlcmlvZCA9IDAgVGhlbg0KICAgICAgICAgICAgICAgUmFpc2VFdmVudCBE +Yk9iamVjdFJlbGlua2VkKExhc3RRZGZOYW1lLCBSZWxpbmtDb3VudGVyKQ0KICAg +ICAgICAgICAgRW5kIElmDQogICAgICAgICBFbmQgSWYNCiAgICAgIEVuZCBJZg0K +ICAgICAgcWRmLkNsb3NlDQogICBOZXh0IHFkZg0KICAgDQogICBJZiBFdmVudFBl +cmlvZCA+IDAgVGhlbg0KICAgICAgSWYgUmVsaW5rQ291bnRlciBNb2QgRXZlbnRQ +ZXJpb2QgPiAwIFRoZW4NCiAgICAgICAgIFJhaXNlRXZlbnQgRGJPYmplY3RSZWxp +bmtlZChMYXN0UWRmTmFtZSwgUmVsaW5rQ291bnRlcikNCiAgICAgIEVuZCBJZg0K +ICAgRW5kIElmDQoNCkVuZCBTdWINCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJyBTdWI6IFJlbGlua1Bhc3NUaHJvdWdoUXVlcnkN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicg +UmVsaW5rIHBhc3MgdGhyb3VnaCBxdWVyeQ0KJw0KJyBQYXJhbWV0ZXJzOg0KJyAg +ICAgUXVlcnlOYW1lICAgLSBUYWJsZSBpbiBmcm9udGVuZA0KJyAgICAgU2F2ZVBX +RCAgICAgLSBTYXZlIE9EQkMgcGFzc3dvcmQgaW4gcGFzcyB0aHJvdWcgcXVlcnkN +CicNCicgUmV0dXJuczoNCicgICAgIEJvb2xlYW4gIC0gc3VjY2Vzcw0KJw0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1 +bmN0aW9uIFJlbGlua1Bhc3NUaHJvdWdoUXVlcnkoQnlWYWwgUXVlcnlOYW1lIEFz +IFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9u +YWwgQnlWYWwgU2F2ZVBXRCBBcyBCb29sZWFuID0gRmFsc2UpIEFzIEJvb2xlYW4N +Cg0KICAgRGltIGRicyBBcyBEQU8uRGF0YWJhc2UNCiAgIERpbSBxZGYgQXMgREFP +LlF1ZXJ5RGVmDQogICBEaW0gTmV3Q29ubmVjdGlvblN0cmluZyBBcyBTdHJpbmcN +Cg0KICAgTmV3Q29ubmVjdGlvblN0cmluZyA9IE1lLkNvbm5lY3Rpb25TdHJpbmcN +CiAgIA0KICAgSWYgTGVuKE5ld0Nvbm5lY3Rpb25TdHJpbmcpID0gMCBUaGVuDQog +ICAgICBFcnIuUmFpc2UgRVJSTlJfTk9DT05GSUcsIF8NCiAgICAgICAgICAgICAg +IlJlbGlua1Bhc3NUaHJvdWdoUXVlcnkiLCAiTWlzc2luZyBPREJDIGNvbm5lY3Rp +b24gc3RyaW5nISINCiAgIEVuZCBJZg0KICAgDQogICBJZiBOb3QgU2F2ZVBXRCBU +aGVuDQogICAgICBOZXdDb25uZWN0aW9uU3RyaW5nID0gUmVtb3ZlUGFzc3dvcmRG +cm9tQ29ubmVjdGlvblN0cmluZyhOZXdDb25uZWN0aW9uU3RyaW5nKQ0KICAgRW5k +IElmDQogICANCiAgIFNldCBkYnMgPSBNZS5DdXJyZW50RGINCiAgIGRicy5RdWVy +eURlZnMuUmVmcmVzaA0KICAgU2V0IHFkZiA9IGRicy5RdWVyeURlZnMoUXVlcnlO +YW1lKQ0KICAgUmVsaW5rUGFzc1Rocm91Z2hRdWVyeSA9IFJlbGlua1Bhc3NUaHJv +dWdoUXVlcnlEZWYocWRmLCBOZXdDb25uZWN0aW9uU3RyaW5nKQ0KICAgcWRmLkNs +b3NlDQoNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0aW9uIFJlbGlua1Bh +c3NUaHJvdWdoUXVlcnlEZWYoQnlWYWwgUWRmUmVmIEFzIERBTy5RdWVyeURlZiwg +Xw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5 +VmFsIE5ld0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nKSBBcyBCb29sZWFuDQog +ICANCiAgIElmIE5vdCBJc1Bhc3NUaHJvdWdoUXVlcnkoUWRmUmVmKSBUaGVuDQog +ICAgICBSZWxpbmtQYXNzVGhyb3VnaFF1ZXJ5RGVmID0gRmFsc2UNCiAgICAgIEV4 +aXQgRnVuY3Rpb24NCiAgIEVuZCBJZg0KICAgDQogICBRZGZSZWYuQ29ubmVjdCA9 +IE5ld0Nvbm5lY3Rpb25TdHJpbmcNCiAgIFJlbGlua1Bhc3NUaHJvdWdoUXVlcnlE +ZWYgPSBUcnVlDQogICANCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFN1YjogUmVsaW5rVGFibGVzQW5k +UXVlcmllcw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LQ0KJw0KJyBSZWxpbmsgYWxsIGxpbmtlZCB0YWJsZXMgYW5kIHBhc3MtdGhyb3Vn +aCBxdWVyaWVzDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBTYXZlUFdEICAgICAt +IFNhdmUgT0RCQyBwYXNzd29yZCBpbiBsaW5rZWQgdGFibGUNCicgICAgIEV2ZW50 +UGVyaW9kIC0gTnVtYmVyIG9mIGxpbmtlZCBlbGVtZW50cyB3aGVuIHRoZSBEYk9i +amVjdFJlbGlua2VkIGV2ZW50IGlzIHRvIGJlIGNhbGxlZC4gKERlZmF1bHQ6IDAg +Li4uIG5vIGV2ZW50IGNhbGwpLg0KJw0KJyBSZXR1cm5zOg0KJyAgICAgTG9uZyAg +LSBOdW1iZXIgb2YgbGlua2VkIHRhYmxlcyBhbmQgcXVlcmllcw0KJw0KJy0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0 +aW9uIFJlbGlua1RhYmxlc0FuZFF1ZXJpZXMoIF8NCiAgICAgICAgICAgICAgICAg +ICAgICAgIE9wdGlvbmFsIEJ5VmFsIFNhdmVQV0QgQXMgQm9vbGVhbiA9IEZhbHNl +LCBfDQogICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBFdmVu +dFBlcmlvZCBBcyBMb25nID0gMCkgQXMgTG9uZw0KICAgDQogICBEaW0gTmV3Q29u +bmVjdGlvblN0cmluZyBBcyBTdHJpbmcNCiAgIERpbSBSZWxpbmtlZENvdW50ZXIg +QXMgTG9uZw0KDQogICBOZXdDb25uZWN0aW9uU3RyaW5nID0gTWUuQ29ubmVjdGlv +blN0cmluZw0KICAgSWYgTGVuKE5ld0Nvbm5lY3Rpb25TdHJpbmcpID0gMCBUaGVu +DQogICAgICBFcnIuUmFpc2UgRVJSTlJfTk9DT05GSUcsIF8NCiAgICAgICAgICAg +ICAgIlJlbGlua1RhYmxlc0FuZFF1ZXJpZXMiLCAiTWlzc2luZyBPREJDIGNvbm5l +Y3Rpb24gc3RyaW5nISINCiAgIEVuZCBJZg0KICAgDQogICAnVGFibGVzDQogICBS +ZWxpbmtUYWJsZXNXb3JrZXIgTmV3Q29ubmVjdGlvblN0cmluZywgU2F2ZVBXRCwg +RXZlbnRQZXJpb2QsIFJlbGlua2VkQ291bnRlcg0KICAgDQogICAnUGFzcyB0aHJv +dWdoIHF1ZXJpZXMNCiAgIFJlbGlua1Bhc3NUaHJvdWdoUXVlcmllc1dvcmtlciBO +ZXdDb25uZWN0aW9uU3RyaW5nLCBTYXZlUFdELCBFdmVudFBlcmlvZCwgUmVsaW5r +ZWRDb3VudGVyDQoNCiAgIFJlbGlua1RhYmxlc0FuZFF1ZXJpZXMgPSBSZWxpbmtl +ZENvdW50ZXINCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IERlbGV0ZU9kYmNUYWJs +ZURlZnMNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicNCicgRGVsZXRlIGFsbCBsaW5rZWQgdGFibGUgaW4gdGhlIGZyb250ZW5kLiAo +SGFzIG5vIGVmZmVjdCBvbiB0aGUgYmFja2VuZCB0YWJsZXMpLg0KJw0KJyBQYXJh +bWV0ZXJzOg0KJyAgICAgRXZlbnRQZXJpb2QgLSBOdW1iZXIgb2YgbGlua2VkIGVs +ZW1lbnRzIHdoZW4gdGhlIERiT2JqZWN0UmVsaW5rZWQgZXZlbnQgaXMgdG8gYmUg +Y2FsbGVkLiAoRGVmYXVsdDogMCAuLi4gbm8gZXZlbnQgY2FsbCkuDQonDQonIFJl +dHVybnM6DQonICAgICBMb25nICAtIE51bWJlciBvZiBkZWxldGVkIHRhYmxlcw0K +Jw0KJyBSZW1hcmtzOg0KJyAgICAgRGVwZW5kaW5nIG9uIHRoZSBzZXR0aW5nIG9m +IEV2ZW50UGVyaW9kIHRoZSBldmVudCBEYk9iamVjdERlbGV0ZWQgaXMgdHJpZ2dl +cmVkDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQpQdWJsaWMgRnVuY3Rpb24gRGVsZXRlT2RiY1RhYmxlRGVmcyhPcHRpb25hbCBC +eVZhbCBFdmVudFBlcmlvZCBBcyBMb25nID0gMCkgQXMgTG9uZw0KICAgDQogICBE +aW0gZGJzIEFzIERBTy5EYXRhYmFzZQ0KICAgRGltIHRkZiBBcyBEQU8uVGFibGVE +ZWYNCiAgIERpbSBpIEFzIExvbmcNCiAgIERpbSBUZGZDb3VudCBBcyBMb25nDQog +ICBEaW0gRGVsZXRlQ291bnRlciBBcyBMb25nDQogICBEaW0gTGFzdERiT2JqZWN0 +TmFtZSBBcyBTdHJpbmcNCg0KICAgU2V0IGRicyA9IE1lLkN1cnJlbnREYg0KICAg +ICAgDQogICBkYnMuVGFibGVEZWZzLlJlZnJlc2gNCiAgIFRkZkNvdW50ID0gZGJz +LlRhYmxlRGVmcy5Db3VudCAtIDENCiAgIEZvciBpID0gVGRmQ291bnQgVG8gMCBT +dGVwIC0xDQogICAgICBTZXQgdGRmID0gZGJzLlRhYmxlRGVmcyhpKQ0KICAgICAg +SWYgSXNMaW5rZWRUYWJsZSh0ZGYpIFRoZW4NCiAgICAgICAgIExhc3REYk9iamVj +dE5hbWUgPSB0ZGYuTmFtZQ0KICAgICAgICAgZGJzLlRhYmxlRGVmcy5EZWxldGUg +TGFzdERiT2JqZWN0TmFtZQ0KICAgICAgICAgRGVsZXRlQ291bnRlciA9IERlbGV0 +ZUNvdW50ZXIgKyAxDQogICAgICAgICBJZiBFdmVudFBlcmlvZCA+IDAgVGhlbiAn +MCAuLi4gUvxja2dhYmUgaXN0IGRlYWt0aXZpZXJ0DQogICAgICAgICAgICBJZiBE +ZWxldGVDb3VudGVyIE1vZCBFdmVudFBlcmlvZCA9IDAgVGhlbg0KICAgICAgICAg +ICAgICAgUmFpc2VFdmVudCBEYk9iamVjdERlbGV0ZWQoTGFzdERiT2JqZWN0TmFt +ZSwgRGVsZXRlQ291bnRlcikNCiAgICAgICAgICAgIEVuZCBJZg0KICAgICAgICAg +RW5kIElmDQogICAgICBFbmQgSWYNCiAgIE5leHQNCiAgIA0KICAgRGVsZXRlT2Ri +Y1RhYmxlRGVmcyA9IERlbGV0ZUNvdW50ZXINCg0KRW5kIEZ1bmN0aW9uDQoNClBy +aXZhdGUgU3ViIENsb3NlRGFvRGJCRSgpDQpPbiBFcnJvciBSZXN1bWUgTmV4dA0K +ICAgSWYgTm90IChtX0Rhb0RiQkUgSXMgTm90aGluZykgVGhlbg0KICAgICAgbV9E +YW9EYkJFLkNsb3NlDQogICAgICBTZXQgbV9EYW9EYkJFID0gTm90aGluZw0KICAg +RW5kIElmDQpFbmQgU3ViDQoNClByaXZhdGUgU3ViIFJlbW92ZVRhYmxlRGVmQXR0 +cmlidXQoQnlSZWYgVGRmUmVmIEFzIERBTy5UYWJsZURlZiwgQnlSZWYgQXR0ciBB +cyBUYWJsZURlZkF0dHJpYnV0ZUVudW0pDQoNCiAgIERpbSBBdHRyaWJ1dGVzVmFs +dWUgQXMgTG9uZw0KDQogICBBdHRyaWJ1dGVzVmFsdWUgPSBUZGZSZWYuQXR0cmli +dXRlcw0KICAgSWYgKEF0dHJpYnV0ZXNWYWx1ZSBBbmQgQXR0cikgPSBBdHRyIFRo +ZW4NCiAgIA0KICAgICAgSWYgKFRkZlJlZi5BdHRyaWJ1dGVzIEFuZCBkYkF0dGFj +aGVkT0RCQykgPSBkYkF0dGFjaGVkT0RCQyBUaGVuDQogICAgICAgICBBdHRyaWJ1 +dGVzVmFsdWUgPSBBdHRyaWJ1dGVzVmFsdWUgLSBkYkF0dGFjaGVkT0RCQw0KICAg +ICAgRWxzZUlmIChUZGZSZWYuQXR0cmlidXRlcyBBbmQgZGJBdHRhY2hlZFRhYmxl +KSA9IGRiQXR0YWNoZWRUYWJsZSBUaGVuDQogICAgICAgICBBdHRyaWJ1dGVzVmFs +dWUgPSBBdHRyaWJ1dGVzVmFsdWUgLSBkYkF0dGFjaGVkVGFibGUNCiAgICAgIEVu +ZCBJZg0KICAgICAgDQogICAgICAnRW50ZmVybmVuDQogICAgICBBdHRyaWJ1dGVz +VmFsdWUgPSBBdHRyaWJ1dGVzVmFsdWUgLSBBdHRyDQogICAgICBUZGZSZWYuQXR0 +cmlidXRlcyA9IEF0dHJpYnV0ZXNWYWx1ZQ0KICAgICAgDQogICBFbmQgSWYNCg0K +RW5kIFN1Yg0KDQpQcml2YXRlIFN1YiBBZGRUYWJsZURlZkF0dHJpYnV0KEJ5UmVm +IFRkZlJlZiBBcyBEQU8uVGFibGVEZWYsIEJ5UmVmIEF0dHIgQXMgVGFibGVEZWZB +dHRyaWJ1dGVFbnVtKQ0KDQogICBEaW0gQXR0cmlidXRlc1ZhbHVlIEFzIExvbmcN +Cg0KICAgQXR0cmlidXRlc1ZhbHVlID0gVGRmUmVmLkF0dHJpYnV0ZXMNCiAgIElm +IChBdHRyaWJ1dGVzVmFsdWUgQW5kIEF0dHIpID0gMCBUaGVuDQogICANCiAgICAg +IElmIChUZGZSZWYuQXR0cmlidXRlcyBBbmQgZGJBdHRhY2hlZE9EQkMpID0gZGJB +dHRhY2hlZE9EQkMgVGhlbg0KICAgICAgICAgQXR0cmlidXRlc1ZhbHVlID0gQXR0 +cmlidXRlc1ZhbHVlIFhvciBkYkF0dGFjaGVkT0RCQw0KICAgICAgRWxzZUlmIChU +ZGZSZWYuQXR0cmlidXRlcyBBbmQgZGJBdHRhY2hlZFRhYmxlKSA9IGRiQXR0YWNo +ZWRUYWJsZSBUaGVuDQogICAgICAgICBBdHRyaWJ1dGVzVmFsdWUgPSBBdHRyaWJ1 +dGVzVmFsdWUgWG9yIGRiQXR0YWNoZWRUYWJsZQ0KICAgICAgRW5kIElmDQogICAN +CiAgICAgICdFcmfkbnplbg0KICAgICAgQXR0cmlidXRlc1ZhbHVlID0gQXR0cmli +dXRlc1ZhbHVlIE9yIEF0dHINCiAgICAgIFRkZlJlZi5BdHRyaWJ1dGVzID0gQXR0 +cmlidXRlc1ZhbHVlDQogICBFbmQgSWYNCg0KRW5kIFN1Yg0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBJc0xp +bmtlZFRhYmxlDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tDQonDQonIENoZWNrIGlmIFRhYmxlRGVmIGlzIGEgbGlua2VkIHRhYmxlDQon +DQonIFBhcmFtZXRlcnM6DQonICAgICBUYWJsZVRvQ2hlY2sgICAtIFRhYmxlRGVm +IHJlZmVyZW5jZSB0byBBY2Nlc3MgdGFibGUgaW4gZnJvbnRlbmQNCicNCicgUmV0 +dXJuczoNCicgICAgIEJvb2xlYW4NCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBJc0xpbmtlZFRhYmxl +KEJ5VmFsIFRhYmxlVG9DaGVjayBBcyBEQU8uVGFibGVEZWYpIEFzIEJvb2xlYW4N +CiAgIElzTGlua2VkVGFibGUgPSAoTGVuKFRyaW0kKFRhYmxlVG9DaGVjay5Db25u +ZWN0KSkgPiAwKQ0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IElzUGFzc1Rocm91Z2hR +dWVyeQ0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +Jw0KJyBDaGVjayBpZiBRdWVyeURlZiBpcyBhIHBhc3MgdGhyb3VnaCBxdWVyeQ0K +Jw0KJyBQYXJhbWV0ZXJzOg0KJyAgICAgUXVlcnlUb0NoZWNrICAgLSBRdWVyeURl +ZiByZWZlcmVuY2UgdG8gQWNjZXNzIHF1ZXJ5IGluIGZyb250ZW5kDQonDQonIFJl +dHVybnM6DQonICAgICBCb29sZWFuDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gSXNQYXNzVGhyb3Vn +aFF1ZXJ5KEJ5VmFsIFF1ZXJ5VG9DaGVjayBBcyBEQU8uUXVlcnlEZWYpIEFzIEJv +b2xlYW4NCiAgIElzUGFzc1Rocm91Z2hRdWVyeSA9IChMZW4oVHJpbSQoUXVlcnlU +b0NoZWNrLkNvbm5lY3QpKSA+IDApDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBG +dW5jdGlvbiBSZW1vdmVQYXNzd29yZEZyb21Db25uZWN0aW9uU3RyaW5nKEJ5VmFs +IE9kYmNDb25uZWN0aW9uU3RyaW5nIEFzIFN0cmluZykgQXMgU3RyaW5nDQogICAN +CiAgIERpbSBPZGJjU2V0dGluZ3MoKSBBcyBTdHJpbmcNCiAgIERpbSBPZGJjU2V0 +dGluZyBBcyBTdHJpbmcNCiAgIERpbSBpIEFzIExvbmcNCiAgIA0KICAgT2RiY1Nl +dHRpbmdzID0gU3BsaXQoT2RiY0Nvbm5lY3Rpb25TdHJpbmcsICI7IikNCiAgIEZv +ciBpID0gMCBUbyBVQm91bmQoT2RiY1NldHRpbmdzKQ0KICAgICAgT2RiY1NldHRp +bmcgPSBUcmltKE9kYmNTZXR0aW5ncyhpKSkNCiAgICAgIElmIExlZnQoT2RiY1Nl +dHRpbmcsIDQpID0gIlBXRD0iIFRoZW4NCiAgICAgICAgIE9kYmNTZXR0aW5ncyhp +KSA9IHZiTnVsbFN0cmluZw0KICAgICAgRWxzZUlmIExlZnQoT2RiY1NldHRpbmcs +IDQpID0gIlVJRD0iIFRoZW4NCiAgICAgICAgIE9kYmNTZXR0aW5ncyhpKSA9IHZi +TnVsbFN0cmluZw0KICAgICAgRW5kIElmDQogICBOZXh0DQogICBSZW1vdmVQYXNz +d29yZEZyb21Db25uZWN0aW9uU3RyaW5nID0gSm9pbihPZGJjU2V0dGluZ3MsICI7 +IikNCiAgIA0KRW5kIEZ1bmN0aW9uDQo= + + 20231011081056 + data/odbc/OdbcHandler.cls + + + SqlTools + VkVSU0lPTiAxLjAgQ0xBU1MNCkJFR0lODQogIE11bHRpVXNlID0gLTEgICdUcnVl +DQpFTkQNCkF0dHJpYnV0ZSBWQl9OYW1lID0gIlNxbFRvb2xzIg0KQXR0cmlidXRl +IFZCX0dsb2JhbE5hbWVTcGFjZSA9IEZhbHNlDQpBdHRyaWJ1dGUgVkJfQ3JlYXRh +YmxlID0gRmFsc2UNCkF0dHJpYnV0ZSBWQl9QcmVkZWNsYXJlZElkID0gVHJ1ZQ0K +QXR0cmlidXRlIFZCX0V4cG9zZWQgPSBGYWxzZQ0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBDbGFzczogZGF0YS5zcWwuU3FsVG9v +bHMNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +RnVuY3Rpb25zIHRvIGJ1aWxkIHNxbCBzdHJpbmdzDQonDQonIEF1dGhvcjoNCicg +ICAgIEpvc2VmIFBvZXR6bA0KJw0KJyBSZW1hcmtzOg0KJyAgICAgIkF0dHJpYnV0 +ZSBWQl9QcmVkZWNsYXJlZElkID0gVHJ1ZSIgdG8gZW5hYmxlIHVzaW5nIFNxbFRv +b2xzIHdpdGhvdXQgZXhwbGljaXQgaW5zdGFudGlhdGlvbi4NCicNCicgV2Fybmlu +ZzoNCicNCid8ICAgIERvbid0IGZvcmdldCB0byBzZXQgcGFyYW1ldGVycyBmb3Ig +ZGF0ZSBmb3JtYXQsIGJvb2xlYW4gYW5kIHdpbGRjYXJkIGZvciB0aGUgREJNUy4N +CicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJzxjb2Rl +bGliPg0KJyAgPGZpbGU+ZGF0YS9TcWxUb29scy5jbHM8L2ZpbGU+DQonICA8bGlj +ZW5zZT5fY29kZWxpYi9saWNlbnNlLmJhczwvbGljZW5zZT4NCicgIDxyZXBsYWNl +PmRhdGEvU3FsVG9vbHMuYmFzPC9yZXBsYWNlPg0KJyAgPHRlc3Q+X3Rlc3QvZGF0 +YS9TcWxUb29sc1Rlc3RzLmNsczwvdGVzdD4NCicgIDx0ZXN0Pl90ZXN0L2RhdGEv +U3FsVG9vbHNCdWlsZENyaXRlcmlhVGVzdHMuY2xzPC90ZXN0Pg0KJzwvY29kZWxp +Yj4NCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicN +Ck9wdGlvbiBDb21wYXJlIFRleHQNCk9wdGlvbiBFeHBsaWNpdA0KDQpQcml2YXRl +IEVudW0gU3FsVG9vbHNFcnJvck51bWJlcnMNCiAgIEVSUk5SX05PQ09ORklHID0g +dmJPYmplY3RFcnJvciArIDENCkVuZCBFbnVtDQoNCicgRGVmYXVsdCB2YWx1ZXMg +Zm9yIG1ldGhvZCBwYXJhbWV0ZXJzDQpQcml2YXRlIENvbnN0IFNRTF9ERUZBVUxU +X1RFWFRERUxJTUlURVIgQXMgU3RyaW5nID0gIiciDQpQcml2YXRlIENvbnN0IFNR +TF9ERUZBVUxUX0RBVEVGT1JNQVQgQXMgU3RyaW5nID0gIiIgICAgICcgIiIgPT4g +U3FsRGF0ZUZvcm1hdCBwcm9wZXJ0eSB3aWxsIHVzZS4NCiAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBUbyBk +aXNhYmxlLCBlbnRlciB2YWx1ZSAoZS5nLiAiXCN5eXl5LW1tXC1kZFwjIiksDQog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICcgdGhlbiB0aGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVm +YXVsdCBlbnRyeS4NClByaXZhdGUgQ29uc3QgU1FMX0RFRkFVTFRfQk9PTFRSVUVT +VFJJTkcgQXMgU3RyaW5nID0gIiIgJyAiIiA9PiBTcWxCb29sZWFuVHJ1ZVN0cmlu +ZyBpcyB1c2VkLg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAnIEVudGVyIHZhbHVlIHRvIGRpc2FibGUgKGUu +Zy4gIlRydWUgb3IgMSIpDQpQcml2YXRlIENvbnN0IFNRTF9ERUZBVUxUX1dJTERD +QVJEIEFzIFN0cmluZyA9ICIlIiAgICAgICcgJSA9IGRlZmF1bHQgdmFsdWUsDQog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICcgc2V0IHJlcXVpcmVkIHZhcmlhdGlvbnMgdmlhIFNxbFdpbGRDYXJk +U3RyaW5nDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICANClByaXZhdGUgQ29uc3QgU3FsQW5kQ29uY2F0U3RyaW5nIEFz +IFN0cmluZyA9ICIgQW5kICINClByaXZhdGUgQ29uc3QgU3FsT3JDb25jYXRTdHJp +bmcgQXMgU3RyaW5nID0gIiBPciAiDQoNClByaXZhdGUgbV9TcWxEYXRlRm9ybWF0 +IEFzIFN0cmluZw0KUHJpdmF0ZSBtX1NxbEJvb2xlYW5UcnVlU3RyaW5nIEFzIFN0 +cmluZw0KUHJpdmF0ZSBtX1NxbFdpbGRDYXJkU3RyaW5nIEFzIFN0cmluZw0KDQpQ +cml2YXRlIENvbnN0IFJlc3VsdFRleHRJZk51bGwgQXMgU3RyaW5nID0gIk51bGwi +DQoNClB1YmxpYyBFbnVtIFNxbFJlbGF0aW9uYWxPcGVyYXRvcnMNCiAgIFtfSWdu +b3JlQWxsXSA9ICZIODAwMDAwMDANCiAgIFNRTF9Ob3QgPSAxDQogICBTUUxfRXF1 +YWwgPSAyDQogICBTUUxfTGVzc1RoYW4gPSA0DQogICBTUUxfR3JlYXRlclRoYW4g +PSA4DQogICBTUUxfTGlrZSA9IDI1Ng0KICAgU1FMX0JldHdlZW4gPSA1MTINCiAg +IFNRTF9JbiA9IDEwMjQNCiAgIFNRTF9BZGRfV2lsZENhcmRTdWZmaXggPSAyMDQ4 +DQogICBTUUxfQWRkX1dpbGRDYXJkUHJlZml4ID0gNDA5Ng0KICAgU1FMX1NwbGl0 +VmFsdWVUb0FycmF5ID0gODE5Mg0KICAgU1FMX0FsbG93U3FsRGlyZWN0ID0gMTYz +ODQNCiAgIFNRTF9Vc2VMaWtlQmVoYXZpb3IgPSA2NTUzNg0KRW5kIEVudW0NCg0K +UHVibGljIEVudW0gU3FsRmllbGREYXRhVHlwZQ0KICAgU1FMX0Jvb2xlYW4gPSAx +DQogICBTUUxfTnVtZXJpYyA9IDINCiAgIFNRTF9UZXh0ID0gMw0KICAgU1FMX0Rh +dGUgPSA0DQpFbmQgRW51bQ0KDQpQdWJsaWMgRW51bSBTcWxMb2dpY2FsT3BlcmF0 +b3INCiAgIFtfU1FMX0RlZmF1bHRdID0gMA0KICAgU1FMX0FuZCA9IDENCiAgIFNR +TF9PciA9IDINCiAgIFNRTF9Db21tYVNlcGFyYXRvciA9IDMNCkVuZCBFbnVtDQoN +CicjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQonIEdyb3VwOiBD +bGFzcyBzdXBwb3J0DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicgRnVuY3Rpb246IENsb25lDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIENyZWF0ZSBhIG5ldyBpbnN0YW5j +ZSB3aXRoIGJhc2ljIHNldHRpbmdzIG9mIHRoZSBjdXJyZW50IGluc3RhbmNlLg0K +Jw0KJyBQYXJhbWV0ZXJzOg0KJw0KJyAgICAgTmV3U3FsRGF0ZUZvcm1hdCAtIHVz +ZSB0aGlzIGRhdGUgZm9ybWF0IGluc3RlYWQgb2YgYmFzZSBpbnN0YW5jZQ0KJyAg +ICAgTmV3U3FsQm9vbGVhblRydWVTdHJpbmcgLSB1c2UgdGhpcyB0ZXh0IGZvciB0 +cnVlIGluc3RlYWQgb2YgYmFzZSBpbnN0YW5jZQ0KJyAgICAgTmV3U3FsV2lsZENh +cmRTdHJpbmcgLSB1c2UgdGhpcyB3aWxkY2FyZCBzdHJpbmcgaW5zdGVhZCBvZiBi +YXNlIGluc3RhbmNlDQonDQonIFJldHVybnM6DQonDQonICAgICBTcWxUb29scyBp +bnN0YW5jZSB3aXRoIGNvbmZpZyBmb3JtIGJhc2UNCicNCicgU2VlIEFsc286DQon +ICAgICBOZXdJbnN0YW5jZQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KUHVibGljIEZ1bmN0aW9uIENsb25lKE9wdGlvbmFsIEJ5 +VmFsIE5ld1NxbERhdGVGb3JtYXQgQXMgU3RyaW5nID0gU1FMX0RFRkFVTFRfREFU +RUZPUk1BVCwgXw0KICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFs +IE5ld1NxbEJvb2xlYW5UcnVlU3RyaW5nIEFzIFN0cmluZyA9IFNRTF9ERUZBVUxU +X0JPT0xUUlVFU1RSSU5HLCBfDQogICAgICAgICAgICAgICAgICAgICAgT3B0aW9u +YWwgQnlWYWwgTmV3U3FsV2lsZENhcmRTdHJpbmcgQXMgU3RyaW5nID0gU1FMX0RF +RkFVTFRfV0lMRENBUkQpIEFzIFNxbFRvb2xzDQoNCg0KICAgSWYgTGVuKE5ld1Nx +bERhdGVGb3JtYXQpID0gMCBUaGVuIE5ld1NxbERhdGVGb3JtYXQgPSBNZS5TcWxE +YXRlRm9ybWF0DQogICBJZiBMZW4oTmV3U3FsQm9vbGVhblRydWVTdHJpbmcpID0g +MCBUaGVuIE5ld1NxbEJvb2xlYW5UcnVlU3RyaW5nID0gTWUuU3FsQm9vbGVhblRy +dWVTdHJpbmcNCiAgIElmIExlbihOZXdTcWxXaWxkQ2FyZFN0cmluZykgPSAwIFRo +ZW4gTmV3U3FsV2lsZENhcmRTdHJpbmcgPSBNZS5TcWxXaWxkQ2FyZFN0cmluZw0K +DQogICBTZXQgQ2xvbmUgPSBOZXdJbnN0YW5jZShOZXdTcWxEYXRlRm9ybWF0LCBO +ZXdTcWxCb29sZWFuVHJ1ZVN0cmluZywgTmV3U3FsV2lsZENhcmRTdHJpbmcpDQoN +CkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBOZXdJbnN0YW5jZQ0KJy0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBDcmVhdGUgYSBuZXcg +aW5zdGFuY2UNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NClB1YmxpYyBGdW5jdGlvbiBOZXdJbnN0YW5jZShCeVZhbCBOZXdTcWxE +YXRlRm9ybWF0IEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgICAgICAg +ICAgIEJ5VmFsIE5ld1NxbEJvb2xlYW5UcnVlU3RyaW5nIEFzIFN0cmluZywgXw0K +ICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5VmFsIE5ld1NxbFdpbGRDYXJk +U3RyaW5nIEFzIFN0cmluZykgQXMgU3FsVG9vbHMNCiAgIA0KICAgRGltIE5ld0lu +c3QgQXMgU3FsVG9vbHMNCg0KICAgU2V0IE5ld0luc3QgPSBOZXcgU3FsVG9vbHMN +CiAgIFdpdGggTmV3SW5zdA0KICAgICAgLlNxbERhdGVGb3JtYXQgPSBOZXdTcWxE +YXRlRm9ybWF0DQogICAgICAuU3FsQm9vbGVhblRydWVTdHJpbmcgPSBOZXdTcWxC +b29sZWFuVHJ1ZVN0cmluZw0KICAgICAgLlNxbFdpbGRDYXJkU3RyaW5nID0gTmV3 +U3FsV2lsZENhcmRTdHJpbmcNCiAgIEVuZCBXaXRoDQoNCiAgIFNldCBOZXdJbnN0 +YW5jZSA9IE5ld0luc3QNCg0KRW5kIEZ1bmN0aW9uDQoNCg0KJyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCicgR3JvdXA6IFNRTCBkaWFsZWN0IHBy +ZWZlcmVuY2VzDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NCicgUHJvcGVydHk6IERBTw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBTcWxUb29scyBpbnN0YW5jZSBjb25maWd1 +cmVkIGZvciBEQU8tU1FMIChKZXQvQUNFKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBEQU8o +KSBBcyBTcWxUb29scw0KICAgU2V0IERBTyA9IE1lLk5ld0luc3RhbmNlKCJcI3l5 +eXktbW0tZGQgaGg6bm46c3NcIyIsICJUcnVlIiwgIioiKQ0KRW5kIFByb3BlcnR5 +DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +UHJvcGVydHk6IFRTcWwNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicNCicgU3FsVG9vbHMgaW5zdGFuY2UgY29uZmlndXJlZCBmb3Ig +VC1TUUwNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQgVFNxbCgpIEFzIFNxbFRvb2xzDQogICBT +ZXQgVFNxbCA9IE1lLk5ld0luc3RhbmNlKCIneXl5eW1tZGQgaGg6bm46c3MnIiwg +IjEiLCAiJSIpDQpFbmQgUHJvcGVydHkNCg0KJyBDb25maWd1cmF0aW9uIGZvciBT +UUwgZGlhbGVjdA0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQonIFByb3BlcnR5OiBTcWxXaWxkQ2FyZFN0cmluZw0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBXaWxkY2FyZCBj +aGFyYWN0ZXIgZm9yIGxpa2UNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQgU3FsV2lsZENhcmRT +dHJpbmcoKSBBcyBTdHJpbmcNCiAgIElmIExlbihtX1NxbFdpbGRDYXJkU3RyaW5n +KSA+IDAgVGhlbg0KICAgICAgU3FsV2lsZENhcmRTdHJpbmcgPSBtX1NxbFdpbGRD +YXJkU3RyaW5nDQogICBFbHNlDQogICAgICBTcWxXaWxkQ2FyZFN0cmluZyA9IFNR +TF9ERUZBVUxUX1dJTERDQVJEDQogICBFbmQgSWYNCkVuZCBQcm9wZXJ0eQ0KDQpQ +dWJsaWMgUHJvcGVydHkgTGV0IFNxbFdpbGRDYXJkU3RyaW5nKEJ5VmFsIE5ld1Zh +bHVlIEFzIFN0cmluZykNCiAgIG1fU3FsV2lsZENhcmRTdHJpbmcgPSBOZXdWYWx1 +ZQ0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IFNxbERhdGVGb3JtYXQNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicNCicgRm9ybWF0IGZv +ciBkYXRlIHZhbHVlcw0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBTcWxEYXRlRm9ybWF0KCkg +QXMgU3RyaW5nDQogICBJZiBMZW4obV9TcWxEYXRlRm9ybWF0KSA+IDAgVGhlbg0K +ICAgICAgU3FsRGF0ZUZvcm1hdCA9IG1fU3FsRGF0ZUZvcm1hdA0KICAgRWxzZQ0K +ICAgICAgU3FsRGF0ZUZvcm1hdCA9IFNRTF9ERUZBVUxUX0RBVEVGT1JNQVQNCiAg +IEVuZCBJZg0KRW5kIFByb3BlcnR5DQoNClB1YmxpYyBQcm9wZXJ0eSBMZXQgU3Fs +RGF0ZUZvcm1hdChCeVZhbCBOZXdWYWx1ZSBBcyBTdHJpbmcpDQogICBtX1NxbERh +dGVGb3JtYXQgPSBOZXdWYWx1ZQ0KRW5kIFByb3BlcnR5DQoNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6IFNxbEJv +b2xlYW5UcnVlU3RyaW5nDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQonDQonIEJvb2xlYW4gc3RyaW5nIGluIFNRTCBzdGF0ZW1lbnQN +CicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1 +YmxpYyBQcm9wZXJ0eSBHZXQgU3FsQm9vbGVhblRydWVTdHJpbmcoKSBBcyBTdHJp +bmcNCiAgIElmIExlbihtX1NxbEJvb2xlYW5UcnVlU3RyaW5nKSA+IDAgVGhlbg0K +ICAgICAgU3FsQm9vbGVhblRydWVTdHJpbmcgPSBtX1NxbEJvb2xlYW5UcnVlU3Ry +aW5nDQogICBFbHNlDQogICAgICBTcWxCb29sZWFuVHJ1ZVN0cmluZyA9IFNRTF9E +RUZBVUxUX0JPT0xUUlVFU1RSSU5HDQogICBFbmQgSWYNCkVuZCBQcm9wZXJ0eQ0K +DQpQdWJsaWMgUHJvcGVydHkgTGV0IFNxbEJvb2xlYW5UcnVlU3RyaW5nKEJ5VmFs +IE5ld1ZhbHVlIEFzIFN0cmluZykNCiAgIG1fU3FsQm9vbGVhblRydWVTdHJpbmcg +PSBOZXdWYWx1ZQ0KRW5kIFByb3BlcnR5DQoNCicjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjDQonIEdyb3VwOiBCdWlsZENyaXRlcmlhDQoNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246 +IEJ1aWxkQ3JpdGVyaWENCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0NCicNCicgQ3JlYXRlIFNRTCBjcml0ZXJpYSBzdHJpbmcNCicNCicg +UGFyYW1ldGVyczoNCicgICAgIEZpZWxkTmFtZSAgICAgICAgICAgIC0gRmllbGQg +bmFtZSBpbiB0aGUgZGF0YSBzb3VyY2UgdG8gYmUgZmlsdGVyZWQNCicgICAgIFJl +bGF0aW9uYWxPcGVyYXRvciAgIC0gUmVsYXRpb25hbCBvcGVyYXRvciAoPSwgPD0s +IGV0Yy4pDQonICAgICBGaWx0ZXJWYWx1ZSAgICAgICAgICAtIEZpbHRlciB2YWx1 +ZSAoY2FuIGJlIGEgc2luZ2xlIHZhbHVlIG9yIGFuIGFycmF5IG9mIHZhbHVlcykN +CicgICAgIEZpbHRlclZhbHVlMiAgICAgICAgIC0gT3B0aW9uYWwgMm5kIGZpbHRl +ciB2YWx1ZSAoZm9yIEJldHdlZW4pDQonICAgICBJZ25vcmVWYWx1ZSAgICAgICAg +ICAtIFRoZSB2YWx1ZSBmb3Igd2hpY2ggbm8gZmlsdGVyIGNvbmRpdGlvbiBpcyB0 +byBiZSBjcmVhdGVkLiAoQXJyYXkgdHJhbnNmZXIgb2YgdmFsdWVzIHBvc3NpYmxl +KQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgU1FMIGNyaXRlcmlhIHN0cmluZw0KJw0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KUHVibGlj +IEZ1bmN0aW9uIEJ1aWxkQ3JpdGVyaWEoQnlWYWwgRmllbGROYW1lIEFzIFN0cmlu +ZywgQnlWYWwgRmllbGREYXRhVHlwZSBBcyBTcWxGaWVsZERhdGFUeXBlLCBfDQog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBSZWxhdGlvbmFsT3Bl +cmF0b3IgQXMgU3FsUmVsYXRpb25hbE9wZXJhdG9ycywgXw0KICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgQnlWYWwgRmlsdGVyVmFsdWUgQXMgVmFyaWFudCwg +Xw0KICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWwgQnlWYWwgRmlsdGVyVmFs +dWUyIEFzIFZhcmlhbnQgPSBOdWxsLCBfDQogICAgICAgICAgICAgICAgICAgICBP +cHRpb25hbCBCeVZhbCBJZ25vcmVWYWx1ZSBBcyBWYXJpYW50LCBfDQogICAgICAg +ICAgICAgICAgICAgICBPcHRpb25hbCBCeVZhbCBEaXNhYmxlSWdub3JlTnVsbFZh +bHVlIEFzIEJvb2xlYW4gPSBGYWxzZSkgQXMgU3RyaW5nDQoNCiAgIERpbSBGaWx0 +ZXJWYWx1ZVN0cmluZyBBcyBTdHJpbmcNCiAgIERpbSBPcGVyYXRvclN0cmluZyBB +cyBTdHJpbmcNCiAgIERpbSBDcml0ZXJpYSBBcyBTdHJpbmcNCiAgIA0KICAgSWYg +KFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgW19JZ25vcmVBbGxdKSA9IFtfSWdub3Jl +QWxsXSBUaGVuDQogICAgICBFeGl0IEZ1bmN0aW9uDQogICBFbmQgSWYNCiAgIA0K +ICAgSWYgSXNNaXNzaW5nKElnbm9yZVZhbHVlKSBUaGVuDQogICAgICBJZiBOb3Qg +RGlzYWJsZUlnbm9yZU51bGxWYWx1ZSBUaGVuDQogICAgICAgICBEaXNhYmxlSWdu +b3JlTnVsbFZhbHVlID0gVHJ1ZQ0KICAgICAgRW5kIElmDQogICAgICBJZ25vcmVW +YWx1ZSA9IE51bGwNCiAgIEVuZCBJZg0KICAgDQogICAnIFNwZWNpYWwgY2FzZXMg +KHBhcnQgMSk6DQogICBJZiBOb3QgSXNBcnJheShGaWx0ZXJWYWx1ZSkgVGhlbg0K +ICAgDQogICAgICBJZiBGaWx0ZXJWYWx1ZSA9ICJ7TlVMTH0iIE9yIEZpbHRlclZh +bHVlID0gIntMRUVSfSIgT3IgRmlsdGVyVmFsdWUgPSAie0VNUFRZfSIgVGhlbg0K +ICAgICAgICAgRmlsdGVyVmFsdWUgPSBOdWxsDQogICAgICAgICBEaXNhYmxlSWdu +b3JlTnVsbFZhbHVlID0gVHJ1ZQ0KICAgICAgRW5kIElmDQogICAgICANCiAgICAg +IElmIEZpbHRlclZhbHVlMiA9ICJ7TlVMTH0iIE9yIEZpbHRlclZhbHVlMiA9ICJ7 +TEVFUn0iIE9yIEZpbHRlclZhbHVlMiA9ICJ7RU1QVFl9IiBUaGVuDQogICAgICAg +ICBGaWx0ZXJWYWx1ZTIgPSBOdWxsDQogICAgICAgICBEaXNhYmxlSWdub3JlTnVs +bFZhbHVlID0gVHJ1ZQ0KICAgICAgRW5kIElmDQogICAgICANCiAgICAgIElmIChS +ZWxhdGlvbmFsT3BlcmF0b3IgQW5kIFNRTF9BbGxvd1NxbERpcmVjdCkgPSBTUUxf +QWxsb3dTcWxEaXJlY3QgVGhlbg0KICAgICAgICAgSWYgRmlsdGVyVmFsdWUgTGlr +ZSAieypAKn0iIFRoZW4gJyBJZGVlIHZvbiBVbHJpY2g6IEFud2VuZGVyIHNjaHJl +aWJ0IFNRTC1BdXNkcnVjaw0KICAgICAgICAgICAgQ3JpdGVyaWEgPSBSZXBsYWNl +KE1pZChGaWx0ZXJWYWx1ZSwgMiwgTGVuKEZpbHRlclZhbHVlKSAtIDIpLCAiQCIs +IEZpZWxkTmFtZSkNCiAgICAgICAgICAgIElmIChSZWxhdGlvbmFsT3BlcmF0b3Ig +QW5kIFNRTF9Ob3QpID0gU1FMX05vdCBUaGVuDQogICAgICAgICAgICAgICBDcml0 +ZXJpYSA9ICJOb3QgIiAmIENyaXRlcmlhDQogICAgICAgICAgICBFbmQgSWYNCiAg +ICAgICAgICAgIEJ1aWxkQ3JpdGVyaWEgPSBDcml0ZXJpYQ0KICAgICAgICAgICAg +RXhpdCBGdW5jdGlvbg0KICAgICAgICAgRW5kIElmDQogICAgICBFbmQgSWYNCiAg +ICAgIA0KICAgRW5kIElmDQogICANCiAgIElmIE51bGxGaWx0ZXJPckVtcHR5Rmls +dGVyKEZpZWxkTmFtZSwgRmllbGREYXRhVHlwZSwgUmVsYXRpb25hbE9wZXJhdG9y +LCBOeihGaWx0ZXJWYWx1ZSwgRmlsdGVyVmFsdWUyKSwgSWdub3JlVmFsdWUsIENy +aXRlcmlhLCBEaXNhYmxlSWdub3JlTnVsbFZhbHVlKSBUaGVuDQogICAgICBCdWls +ZENyaXRlcmlhID0gQ3JpdGVyaWENCiAgICAgIEV4aXQgRnVuY3Rpb24NCiAgIEVu +ZCBJZg0KICAgDQogICBJZiAoUmVsYXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfU3Bs +aXRWYWx1ZVRvQXJyYXkpID0gU1FMX1NwbGl0VmFsdWVUb0FycmF5IFRoZW4NCiAg +ICAgIElmIEluU3RyKDEsIEZpbHRlclZhbHVlLCAiOyIpID4gMCBUaGVuDQogICAg +ICAgICBGaWx0ZXJWYWx1ZSA9IFNwbGl0KENoYXJUcmltKEZpbHRlclZhbHVlLCAi +OyIpLCAiOyIpDQogICAgICBFbmQgSWYNCiAgICAgIFJlbGF0aW9uYWxPcGVyYXRv +ciA9IFJlbGF0aW9uYWxPcGVyYXRvciBYb3IgU1FMX1NwbGl0VmFsdWVUb0FycmF5 +DQogICBFbmQgSWYNCiAgIA0KICAgJ1NwZWNpYWwgY2FzZXMgKHBhcnQgMik6DQog +ICBJZiBOb3QgSXNBcnJheShGaWx0ZXJWYWx1ZSkgVGhlbg0KICAgICANCiAgICAg +IElmIEZpZWxkRGF0YVR5cGUgPSBTUUxfTnVtZXJpYyBUaGVuDQogICAgICANCiAg +ICAgICAgIElmIEZpbHRlclZhbHVlID0gIioiIEFuZCBSZWxhdGlvbmFsT3BlcmF0 +b3IgPSBTUUxfRXF1YWwgVGhlbg0KICAgICAgICAgICAgQnVpbGRDcml0ZXJpYSA9 +IEJ1aWxkQ3JpdGVyaWEoRmllbGROYW1lLCBGaWVsZERhdGFUeXBlLCBTUUxfTm90 +LCBOdWxsLCBOdWxsLCAwLCBUcnVlKQ0KICAgICAgICAgICAgRXhpdCBGdW5jdGlv +bg0KICAgICAgICAgRW5kIElmDQogICAgICAgICANCiAgICAgICAgIElmIElzTnVs +bChGaWx0ZXJWYWx1ZTIpIFRoZW4NCiAgICAgICAgICAgIElmIFRyeUJ1aWxkTnVt +ZXJpY1NwZWNpYWxDYXNlc0NyaXRlcmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlw +ZSwgUmVsYXRpb25hbE9wZXJhdG9yLCBGaWx0ZXJWYWx1ZSwgSWdub3JlVmFsdWUs +IERpc2FibGVJZ25vcmVOdWxsVmFsdWUsIENyaXRlcmlhKSBUaGVuDQogICAgICAg +ICAgICAgICBCdWlsZENyaXRlcmlhID0gQ3JpdGVyaWENCiAgICAgICAgICAgICAg +IEV4aXQgRnVuY3Rpb24NCiAgICAgICAgICAgIEVuZCBJZg0KICAgICAgICAgRW5k +IElmDQogICAgICAgICANCiAgICAgICAgIENvbmZpZ051bWVyaWNTcGVjaWFscyBS +ZWxhdGlvbmFsT3BlcmF0b3IsIEZpbHRlclZhbHVlLCBGaWx0ZXJWYWx1ZTINCiAg +ICAgICAgIA0KICAgICAgRW5kIElmDQogICAgICANCiAgIEVuZCBJZg0KDQogICBJ +ZiBUcnlCdWlsZEluQ3JpdGVyaWEoRmllbGROYW1lLCBGaWVsZERhdGFUeXBlLCBS +ZWxhdGlvbmFsT3BlcmF0b3IsIEZpbHRlclZhbHVlLCBJZ25vcmVWYWx1ZSwgQ3Jp +dGVyaWEpIFRoZW4NCiAgICAgIEJ1aWxkQ3JpdGVyaWEgPSBDcml0ZXJpYQ0KICAg +ICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQoNCiAgIElmIFRyeUJ1aWxkQXJy +YXlDcml0ZXJpYShGaWVsZE5hbWUsIEZpZWxkRGF0YVR5cGUsIFJlbGF0aW9uYWxP +cGVyYXRvciwgRmlsdGVyVmFsdWUsIElnbm9yZVZhbHVlLCBDcml0ZXJpYSkgVGhl +bg0KICAgICAgQnVpbGRDcml0ZXJpYSA9IENyaXRlcmlhDQogICAgICBFeGl0IEZ1 +bmN0aW9uDQogICBFbmQgSWYNCg0KICAgSWYgVHJ5QnVpbGRCZXR3ZWVuQ3JpdGVy +aWEoRmllbGROYW1lLCBGaWVsZERhdGFUeXBlLCBSZWxhdGlvbmFsT3BlcmF0b3Is +IEZpbHRlclZhbHVlLCBGaWx0ZXJWYWx1ZTIsIElnbm9yZVZhbHVlLCBDcml0ZXJp +YSkgVGhlbg0KICAgICAgQnVpbGRDcml0ZXJpYSA9IENyaXRlcmlhDQogICAgICBF +eGl0IEZ1bmN0aW9uDQogICBFbmQgSWYNCg0KICAgSWYgKFJlbGF0aW9uYWxPcGVy +YXRvciBBbmQgU1FMX0xpa2UpID0gU1FMX0xpa2UgVGhlbg0KICAgICAgSWYgU3Fs +V2lsZENhcmRTdHJpbmcgPD4gIioiIFRoZW4NCiAgICAgICAgIElmIEluU3RyKDEs +IEZpbHRlclZhbHVlLCAiKiIpID4gMCBUaGVuDQogICAgICAgICAgICBGaWx0ZXJW +YWx1ZSA9IFJlcGxhY2UoRmlsdGVyVmFsdWUsICJbKl0iLCAiQEBAfHx8U1RBUnx8 +fEBAQCIpDQogICAgICAgICAgICBGaWx0ZXJWYWx1ZSA9IFJlcGxhY2UoRmlsdGVy +VmFsdWUsICIqIiwgU3FsV2lsZENhcmRTdHJpbmcpDQogICAgICAgICAgICBGaWx0 +ZXJWYWx1ZSA9IFJlcGxhY2UoRmlsdGVyVmFsdWUsICJAQEB8fHxTVEFSfHx8QEBA +IiwgIioiKQ0KICAgICAgICAgRW5kIElmDQogICAgICBFbmQgSWYNCiAgIEVuZCBJ +Zg0KDQogICBJZiAoUmVsYXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfQWRkX1dpbGRD +YXJkU3VmZml4KSA9IFNRTF9BZGRfV2lsZENhcmRTdWZmaXggVGhlbg0KICAgICAg +SWYgVHJ5QnVpbGRXaWxkQ2FyZFN1ZmZpeE9yUHJlQnVpbGRQYXJhbXMoRmllbGRO +YW1lLCBGaWVsZERhdGFUeXBlLCBSZWxhdGlvbmFsT3BlcmF0b3IsIEZpbHRlclZh +bHVlLCBGaWx0ZXJWYWx1ZTIsIElnbm9yZVZhbHVlLCBDcml0ZXJpYSkgVGhlbg0K +ICAgICAgICAgQnVpbGRDcml0ZXJpYSA9IENyaXRlcmlhDQogICAgICAgICBFeGl0 +IEZ1bmN0aW9uDQogICAgICBFbmQgSWYNCiAgIEVuZCBJZg0KDQogICBJZiAoUmVs +YXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfQWRkX1dpbGRDYXJkUHJlZml4KSA9IFNR +TF9BZGRfV2lsZENhcmRQcmVmaXggVGhlbg0KICAgICAgSWYgKFJlbGF0aW9uYWxP +cGVyYXRvciBBbmQgU1FMX0xpa2UpID0gU1FMX0xpa2UgVGhlbg0KICAgICAgICAg +RmlsdGVyVmFsdWUgPSBTcWxXaWxkQ2FyZFN0cmluZyAmIEZpbHRlclZhbHVlDQog +ICAgICBFbmQgSWYNCiAgIEVuZCBJZg0KDQogICBGaWx0ZXJWYWx1ZVN0cmluZyA9 +IENvbnZlcnRUb1NxbFRleHQoRmlsdGVyVmFsdWUsIEZpZWxkRGF0YVR5cGUpDQoN +CiAgIElmIChSZWxhdGlvbmFsT3BlcmF0b3IgQW5kIFNRTF9MaWtlKSA9IFNRTF9M +aWtlIFRoZW4NCiAgICAgIE9wZXJhdG9yU3RyaW5nID0gIiBMaWtlICINCiAgICAg +IElmIChSZWxhdGlvbmFsT3BlcmF0b3IgQW5kIFNRTF9Ob3QpID0gU1FMX05vdCBU +aGVuDQogICAgICAgICBPcGVyYXRvclN0cmluZyA9ICIgTm90IiAmIE9wZXJhdG9y +U3RyaW5nDQogICAgICBFbmQgSWYNCiAgICAgIEJ1aWxkQ3JpdGVyaWEgPSBGaWVs +ZE5hbWUgJiBPcGVyYXRvclN0cmluZyAmIEZpbHRlclZhbHVlU3RyaW5nDQogICAg +ICBFeGl0IEZ1bmN0aW9uDQogICBFbmQgSWYNCiAgIA0KICAgT3BlcmF0b3JTdHJp +bmcgPSBHZXRSZWxhdGlvbmFsT3BlcmF0b3JTdHJpbmcoUmVsYXRpb25hbE9wZXJh +dG9yKQ0KDQogICBDcml0ZXJpYSA9IEZpZWxkTmFtZSAmICIgIiAmIE9wZXJhdG9y +U3RyaW5nICYgIiAiICYgRmlsdGVyVmFsdWVTdHJpbmcNCg0KICAgSWYgKFJlbGF0 +aW9uYWxPcGVyYXRvciBBbmQgU1FMX05vdCkgPSBTUUxfTm90IFRoZW4NCiAgICAg +ICc/OiB3aWxsIHRoaXMgbGluZSBiZSByZWFjaGVkPw0KICAgICAgQ3JpdGVyaWEg +PSAiTm90ICIgJiBDcml0ZXJpYQ0KICAgRW5kIElmDQoNCiAgIEJ1aWxkQ3JpdGVy +aWEgPSBDcml0ZXJpYQ0KDQpFbmQgRnVuY3Rpb24NCg0KJyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMNCicgR3JvdXA6IENvbnZlcnQgdG8gU1FMDQoN +CictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVu +Y3Rpb246IENvbnZlcnRUb1NxbFRleHQNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NCicNCicgQ29udmVydCB2YWx1ZXMgdG8gc3RyaW5n +IGZvciBTUUwgc3RhdGVtZW50IGFzc2VtYmxlZCBieSBWQkEuDQonDQonIFBhcmFt +ZXRlcnM6DQonICAgICBWYWx1ZSAgICAgICAgICAtIFZhbHVlIHRvIGNvbnZlcnQN +CicgICAgIEZpZWxkRGF0YVR5cGUgIC0gRGF0YSB0eXBlIG9mIHRoZSB2YWx1ZSB0 +byBiZSBjb252ZXJ0ZWQNCicNCicgUmV0dXJuczoNCicgICAgIFN0cmluZyAgIC0g +U1FMIGNvbmZvcm0gc3RyaW5nDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gQ29udmVydFRvU3FsVGV4 +dChCeVZhbCBWYWx1ZSBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICBCeVZhbCBGaWVsZERhdGFUeXBlIEFzIFNxbEZpZWxkRGF0 +YVR5cGUpIEFzIFN0cmluZw0KICAgICAgICAgICAgICAgICAgICAgDQogICBTZWxl +Y3QgQ2FzZSBGaWVsZERhdGFUeXBlDQogICAgICBDYXNlIFNxbEZpZWxkRGF0YVR5 +cGUuU1FMX1RleHQNCiAgICAgICAgIENvbnZlcnRUb1NxbFRleHQgPSBUZXh0VG9T +cWxUZXh0KFZhbHVlKQ0KICAgICAgQ2FzZSBTcWxGaWVsZERhdGFUeXBlLlNRTF9O +dW1lcmljDQogICAgICAgICBDb252ZXJ0VG9TcWxUZXh0ID0gTnVtYmVyVG9TcWxU +ZXh0KFZhbHVlKQ0KICAgICAgQ2FzZSBTcWxGaWVsZERhdGFUeXBlLlNRTF9EYXRl +DQogICAgICAgICBDb252ZXJ0VG9TcWxUZXh0ID0gRGF0ZVRvU3FsVGV4dChWYWx1 +ZSkNCiAgICAgIENhc2UgU3FsRmllbGREYXRhVHlwZS5TUUxfQm9vbGVhbg0KICAg +ICAgICAgQ29udmVydFRvU3FsVGV4dCA9IEJvb2xlYW5Ub1NxbFRleHQoVmFsdWUp +DQogICAgICBDYXNlIEVsc2UNCiAgICAgICAgIEVyci5SYWlzZSB2Yk9iamVjdEVy +cm9yLCAiU3FsVG9vbHMuQ29udmVydFRvU3FsVGV4dCIsICJGaWVsZERhdGFUeXBl +ICciICYgRmllbGREYXRhVHlwZSAmICInIG5vdCBzdXBwb3J0ZWQiDQogICBFbmQg +U2VsZWN0DQogICANCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBUZXh0VG9TcWxUZXh0 +DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQon +IFByZXBhcmUgdGV4dCBmb3IgU1FMIHN0YXRlbWVudA0KJw0KJyBQYXJhbWV0ZXJz +Og0KJyAgICAgVmFsdWUgICAgICAgICAgICAgICAgICAgLSBWYWx1ZSB0byBjb252 +ZXJ0DQonICAgICBEZWxpbWl0ZXIgICAgICAgICAgICAgICAtIERlbGltaXRlciBm +b3IgdGV4dCB2YWx1ZXMuIChJbiBtb3N0IERCTVMgJyBpcyB1c2VkIGFzIGEgZGVs +aW1pdGVyKS4NCicgICAgIFdpdGhvdXRMZWZ0UmlnaHREZWxpbSAgIC0gT25seSBk +b3VibGUgdGhlIGJvdW5kYXJ5IGRyYXdpbmcgd2l0aGluIHRoZSB2YWx1ZXMsIGJ1 +dCBkbyBub3Qgc2V0IHRoZSBib3VuZGFyeS4NCicNCicgUmV0dXJuczoNCicgICAg +IFN0cmluZw0KJw0KJyBFeGFtcGxlOg0KJyAgICAgICAgc3RyU1FMID0gInNlbGVj +dCAuLi4gZnJvbSB0YWJlbGxlIHdoZXJlIEZlbGQgPSAiICYgVGV4dFRvU3FsVGV4 +dCgiYWInY2QiKQ0KJyAgICAgPT4gc3RyU1FMID0gInNlbGVjdCAuLi4gZnJvbSB0 +YWJlbGxlIHdoZXJlIEZlbGQgPSAnYWInJ2NkJyINCicNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBUZXh0 +VG9TcWxUZXh0KEJ5VmFsIFZhbHVlIEFzIFZhcmlhbnQsIF8NCiAgICAgICAgICAg +ICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIERlbGltaXRlciBBcyBTdHJpbmcgPSBT +UUxfREVGQVVMVF9URVhUREVMSU1JVEVSLCBfDQogICAgICAgICAgICAgICAgICAg +ICBPcHRpb25hbCBCeVZhbCBXaXRob3V0TGVmdFJpZ2h0RGVsaW0gQXMgQm9vbGVh +biA9IEZhbHNlKSBBcyBTdHJpbmcNCiAgIA0KICAgRGltIFJlc3VsdCBBcyBTdHJp +bmcNCiAgIA0KICAgSWYgSXNOdWxsKFZhbHVlKSBUaGVuDQogICAgICBUZXh0VG9T +cWxUZXh0ID0gUmVzdWx0VGV4dElmTnVsbA0KICAgICAgRXhpdCBGdW5jdGlvbg0K +ICAgRW5kIElmDQogICANCiAgIFJlc3VsdCA9IFJlcGxhY2UkKFZhbHVlLCBEZWxp +bWl0ZXIsIERlbGltaXRlciAmIERlbGltaXRlcikNCiAgIElmIE5vdCBXaXRob3V0 +TGVmdFJpZ2h0RGVsaW0gVGhlbg0KICAgICAgUmVzdWx0ID0gRGVsaW1pdGVyICYg +UmVzdWx0ICYgRGVsaW1pdGVyDQogICBFbmQgSWYNCiAgIA0KICAgVGV4dFRvU3Fs +VGV4dCA9IFJlc3VsdA0KDQpFbmQgRnVuY3Rpb24NCg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBGdW5jdGlvbjogRGF0ZVRvU3Fs +VGV4dA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +Jw0KJyBDb252ZXJ0IGRhdGUgdmFsdWUgdG8gc3RyaW5nIGZvciBTUUwgc3RhdGVt +ZW50IGFzc2VtYmxlZCBieSBWQkEuDQonDQonIFBhcmFtZXRlcnM6DQonICAgICBW +YWx1ZSAgICAgICAgICAtIFZhbHVlIHRvIGNvbnZlcnQNCicgICAgIEZvcm1hdFN0 +cmluZyAgIC0gRGF0ZSBmb3JtYXQgKGRlcGVuZHMgb24gREJNUyEpDQonDQonIFJl +dHVybnM6DQonICAgICBTdHJpbmcNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBEYXRlVG9TcWxUZXh0 +KEJ5VmFsIFZhbHVlIEFzIFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAgICAgICAg +IE9wdGlvbmFsIEJ5VmFsIEZvcm1hdFN0cmluZyBBcyBTdHJpbmcgPSBTUUxfREVG +QVVMVF9EQVRFRk9STUFUKSBBcyBTdHJpbmcNCg0KICAgSWYgSXNOdWxsKFZhbHVl +KSBUaGVuDQogICAgICBEYXRlVG9TcWxUZXh0ID0gUmVzdWx0VGV4dElmTnVsbA0K +ICAgICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIElmIE5vdCBJ +c0RhdGUoVmFsdWUpIFRoZW4NCiAgICAgIEVyci5SYWlzZSB2Yk9iamVjdEVycm9y +LCAiU3FsVG9vbHMuRGF0ZVRvU3FsVGV4dCIsICJEZXIgV2VydCAnIiAmIFZhbHVl +ICYgIicgdm9tIFBhcmFtZXRlciBWYWx1ZSBpc3Qga2VpbiBEYXR1bXN3ZXJ0ISIN +CiAgIEVuZCBJZg0KDQogICBJZiBMZW4oRm9ybWF0U3RyaW5nKSA9IDAgVGhlbg0K +ICAgICAgRm9ybWF0U3RyaW5nID0gU3FsRGF0ZUZvcm1hdA0KICAgICAgSWYgTGVu +KEZvcm1hdFN0cmluZykgPSAwIFRoZW4NCiAgICAgICAgIEVyci5SYWlzZSBTcWxU +b29sc0Vycm9yTnVtYmVycy5FUlJOUl9OT0NPTkZJRywgIkRhdGVUb1NxbFRleHQi +LCAiZGF0ZSBmb3JtYXQgaXMgbm90IGRlZmluZWQiDQogICAgICBFbmQgSWYNCiAg +IEVuZCBJZg0KICAgDQogICBEYXRlVG9TcWxUZXh0ID0gVkJBLkZvcm1hdCQoVmFs +dWUsIEZvcm1hdFN0cmluZykNCg0KRW5kIEZ1bmN0aW9uDQoNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgRnVuY3Rpb246IE51bWJl +clRvU3FsVGV4dA0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KJw0KJyBDb252ZXJ0IG51bWVyaWMgdmFsdWUgdG8gc3RyaW5nIGZvciBT +UUwgc3RhdGVtZW50IGFzc2VtYmxlZCBieSBWQkEuDQonDQonIFBhcmFtZXRlcnM6 +DQonICAgICBWYWx1ZSAgICAgICAgICAtIFZhbHVlIHRvIGNvbnZlcnQNCicgICAg +IEZvcm1hdFN0cmluZyAgIC0gRGF0ZSBmb3JtYXQgKGRlcGVuZHMgb24gREJNUyEp +DQonDQonIFJldHVybnM6DQonICAgICBTdHJpbmcNCicNCicgUmVtYXJrczoNCicg +ICAgIFN0ciBmdW5jdGlvbiBlbnN1cmVzICIuIi4NCicNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBGdW5jdGlvbiBOdW1i +ZXJUb1NxbFRleHQoQnlWYWwgVmFsdWUgQXMgVmFyaWFudCkgQXMgU3RyaW5nDQoN +CiAgIERpbSBSZXN1bHQgQXMgU3RyaW5nDQoNCiAgIElmIElzTnVsbChWYWx1ZSkg +VGhlbg0KICAgICAgTnVtYmVyVG9TcWxUZXh0ID0gUmVzdWx0VGV4dElmTnVsbA0K +ICAgICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIFZhbHVlID0g +Q29udmVydFRvTnVtZXJpYyhWYWx1ZSkNCiAgIA0KICAgUmVzdWx0ID0gVHJpbSQo +U3RyJChWYWx1ZSkpDQogICBJZiBMZWZ0KFJlc3VsdCwgMSkgPSAiLiIgVGhlbg0K +ICAgICAgUmVzdWx0ID0gIjAiICYgUmVzdWx0DQogICBFbmQgSWYNCiAgIA0KICAg +TnVtYmVyVG9TcWxUZXh0ID0gUmVzdWx0DQogICANCkVuZCBGdW5jdGlvbg0KDQpG +cmllbmQgRnVuY3Rpb24gQ29udmVydFRvTnVtZXJpYyhCeVZhbCBWYWx1ZSBBcyBW +YXJpYW50KSBBcyBWYXJpYW50DQogICANCiAgIENvbnN0IENoZWNrTnVtYmVyIEFz +IERvdWJsZSA9IDEuMjMNCiAgIA0KICAgRGltIENoZWNrVGV4dCBBcyBTdHJpbmcN +CiAgIERpbSBEZWNpbWFsU2VwYXJhdG9yVG9SZXBsYWNlIEFzIFN0cmluZw0KICAg +RGltIE5ld0RlY2ltYWxTZXBhcmF0b3IgQXMgU3RyaW5nDQogICANCiAgIElmIElz +TnVsbChWYWx1ZSkgVGhlbg0KICAgICAgQ29udmVydFRvTnVtZXJpYyA9IE51bGwN +CiAgICAgIEV4aXQgRnVuY3Rpb24NCiAgIEVsc2VJZiBDU3RyKFZhbHVlKSA9IHZi +TnVsbFN0cmluZyBUaGVuDQogICAgICBDb252ZXJ0VG9OdW1lcmljID0gTnVsbA0K +ICAgICAgRXhpdCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIENoZWNrVGV4 +dCA9IENTdHIoQ2hlY2tOdW1iZXIpDQogICBJZiBJblN0cigxLCBDaGVja1RleHQs +ICIsIikgPiAwIFRoZW4NCiAgICAgIERlY2ltYWxTZXBhcmF0b3JUb1JlcGxhY2Ug +PSAiLiINCiAgICAgIE5ld0RlY2ltYWxTZXBhcmF0b3IgPSAiLCINCiAgIEVsc2UN +CiAgICAgIERlY2ltYWxTZXBhcmF0b3JUb1JlcGxhY2UgPSAiLCINCiAgICAgIE5l +d0RlY2ltYWxTZXBhcmF0b3IgPSAiLiINCiAgIEVuZCBJZg0KICAgDQogICBJZiBJ +blN0cigxLCBWYWx1ZSwgRGVjaW1hbFNlcGFyYXRvclRvUmVwbGFjZSkgPiAwIFRo +ZW4NCiAgICAgICBWYWx1ZSA9IFJlcGxhY2UoVmFsdWUsIERlY2ltYWxTZXBhcmF0 +b3JUb1JlcGxhY2UsIE5ld0RlY2ltYWxTZXBhcmF0b3IpDQogICAgICAgRG8gV2hp +bGUgVmFsdWUgTGlrZSAiKiIgJiBOZXdEZWNpbWFsU2VwYXJhdG9yICYgIioiICYg +TmV3RGVjaW1hbFNlcGFyYXRvciAmICIqIg0KICAgICAgICAgIFZhbHVlID0gUmVw +bGFjZShWYWx1ZSwgTmV3RGVjaW1hbFNlcGFyYXRvciwgdmJOdWxsU3RyaW5nLCAx +LCAxKQ0KICAgICAgIExvb3ANCiAgICBFbmQgSWYNCiAgIA0KICAgQ29udmVydFRv +TnVtZXJpYyA9IENEYmwoVmFsdWUpDQogICANCkVuZCBGdW5jdGlvbg0KDQonLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9u +OiBCb29sZWFuVG9TcWxUZXh0DQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tDQonDQonIFByZXBhcmUgQm9vbGVhbiBmb3IgU1FMIHRleHQN +CicNCicgUGFyYW1ldGVyczoNCicgICAgIFZhbHVlICAgICAgICAgIC0gVmFsdWUg +dG8gY29udmVydA0KJyAgICAgVHJ1ZVN0cmluZyAgIC0gICBTdHJpbmcgZm9yIHRy +dWUgdmFsdWUgKG9wdGlvbmFsKQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgU3RyaW5n +DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQ +dWJsaWMgRnVuY3Rpb24gQm9vbGVhblRvU3FsVGV4dChCeVZhbCBWYWx1ZSBBcyBW +YXJpYW50LCBfDQogICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbCBCeVZh +bCBUcnVlU3RyaW5nIEFzIFN0cmluZyA9IFNRTF9ERUZBVUxUX0JPT0xUUlVFU1RS +SU5HKSBBcyBTdHJpbmcNCg0KICAgSWYgSXNOdWxsKFZhbHVlKSBUaGVuDQogICAg +ICBCb29sZWFuVG9TcWxUZXh0ID0gUmVzdWx0VGV4dElmTnVsbA0KICAgICAgRXhp +dCBGdW5jdGlvbg0KICAgRW5kIElmDQoNCiAgIElmIENCb29sKFZhbHVlKSA9IFRy +dWUgVGhlbiAnIENCb29sKFZhbHVlKSB0byByYWlzZSBlcnJvciAxMyAodHlwZSBt +aXNtYXRjaCkgaWYgVmFsdWUgaXMgbm90IGEgYm9vbGVhbg0KICAgICAgSWYgTGVu +KFRydWVTdHJpbmcpID0gMCBUaGVuDQogICAgICAgICBUcnVlU3RyaW5nID0gU3Fs +Qm9vbGVhblRydWVTdHJpbmcNCiAgICAgICAgIElmIExlbihUcnVlU3RyaW5nKSA9 +IDAgVGhlbg0KICAgICAgICAgICAgRXJyLlJhaXNlIFNxbFRvb2xzRXJyb3JOdW1i +ZXJzLkVSUk5SX05PQ09ORklHLCAiQm9vbGVhblRvU3FsVGV4dCIsICJib29sZWFu +IHN0cmluZyBmb3IgdHJ1ZSBpcyBub3QgZGVmaW5lZCINCiAgICAgICAgIEVuZCBJ +Zg0KICAgICAgRW5kIElmDQogICAgICBCb29sZWFuVG9TcWxUZXh0ID0gVHJ1ZVN0 +cmluZw0KICAgRWxzZQ0KICAgICAgQm9vbGVhblRvU3FsVGV4dCA9ICIwIg0KICAg +RW5kIElmDQogICANCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0aW9uIENv +bmZpZ051bWVyaWNTcGVjaWFscyggXw0KICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgQnlSZWYgUmVsYXRpb25hbE9wZXJhdG9yIEFzIFNxbFJlbGF0aW9uYWxP +cGVyYXRvcnMsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVm +IEZpbHRlclZhbHVlIEFzIFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgIEJ5UmVmIEZpbHRlclZhbHVlMiBBcyBWYXJpYW50KQ0KDQogICBJ +ZiBMZWZ0KEZpbHRlclZhbHVlLCAxKSA9ICI8IiBUaGVuDQogICAgICBJZiAoKFJl +bGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX0VxdWFsKSA9IFNRTF9FcXVhbCkgVGhl +bg0KICAgICAgICAgUmVsYXRpb25hbE9wZXJhdG9yID0gUmVsYXRpb25hbE9wZXJh +dG9yIC0gU1FMX0VxdWFsDQogICAgICBFbmQgSWYNCiAgICAgIFJlbGF0aW9uYWxP +cGVyYXRvciA9IFJlbGF0aW9uYWxPcGVyYXRvciBPciBTUUxfTGVzc1RoYW4NCiAg +ICAgIEZpbHRlclZhbHVlID0gTWlkKEZpbHRlclZhbHVlLCAyKQ0KICAgRW5kIElm +DQogICANCiAgIElmIExlZnQoRmlsdGVyVmFsdWUsIDEpID0gIj4iIFRoZW4NCiAg +ICAgIElmICgoUmVsYXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfRXF1YWwpID0gU1FM +X0VxdWFsKSBUaGVuDQogICAgICAgICBSZWxhdGlvbmFsT3BlcmF0b3IgPSBSZWxh +dGlvbmFsT3BlcmF0b3IgLSBTUUxfRXF1YWwNCiAgICAgIEVuZCBJZg0KICAgICAg +UmVsYXRpb25hbE9wZXJhdG9yID0gUmVsYXRpb25hbE9wZXJhdG9yIE9yIFNRTF9H +cmVhdGVyVGhhbg0KICAgICAgRmlsdGVyVmFsdWUgPSBNaWQoRmlsdGVyVmFsdWUs +IDIpDQogICBFbmQgSWYNCg0KICAgSWYgTGVmdChGaWx0ZXJWYWx1ZSwgMSkgPSAi +PSIgVGhlbg0KICAgICAgUmVsYXRpb25hbE9wZXJhdG9yID0gUmVsYXRpb25hbE9w +ZXJhdG9yIE9yIFNRTF9FcXVhbA0KICAgICAgRmlsdGVyVmFsdWUgPSBNaWQoRmls +dGVyVmFsdWUsIDIpDQogICBFbmQgSWYNCiAgIA0KICAgSWYgUmlnaHQoRmlsdGVy +VmFsdWUsIDEpID0gIioiIFRoZW4NCiAgICAgIFJlbGF0aW9uYWxPcGVyYXRvciA9 +IFJlbGF0aW9uYWxPcGVyYXRvciBPciBTUUxfQWRkX1dpbGRDYXJkU3VmZml4DQog +ICBFbHNlSWYgUmlnaHQoRmlsdGVyVmFsdWUyLCAxKSA9ICIqIiBUaGVuDQogICAg +ICBSZWxhdGlvbmFsT3BlcmF0b3IgPSBSZWxhdGlvbmFsT3BlcmF0b3IgT3IgU1FM +X0FkZF9XaWxkQ2FyZFN1ZmZpeA0KICAgRW5kIElmDQoNCkVuZCBGdW5jdGlvbg0K +DQpQcml2YXRlIEZ1bmN0aW9uIEdldE5leHREaWdpdE51bWJlcihCeVZhbCBaIEFz +IFZhcmlhbnQsIE9wdGlvbmFsIEFkZFRvQWJzb2x1dGVWYWx1ZSBBcyBCb29sZWFu +ID0gRmFsc2UpIEFzIERvdWJsZQ0KICAgDQogICBEaW0gVGVzdFN0cmluZyBBcyBT +dHJpbmcNCiAgIERpbSBLb21tYVBvcyBBcyBMb25nDQogICBEaW0gZGlnaXRzIEFz +IExvbmcNCiAgIERpbSBJc05lZ2F0aXYgQXMgQm9vbGVhbg0KDQogICBDb25zdCBB +ZGRpdGlvbmFsRGVjRGlnaXQgQXMgU3RyaW5nID0gIjEiDQogICBDb25zdCBBZGRp +dGlvbmFsRGVjRGlnaXRLb3JyIEFzIERvdWJsZSA9IDAuMQ0KICAgDQogICBUZXN0 +U3RyaW5nID0gVHJpbShDU3RyKENvbnZlcnRUb051bWVyaWMoUmVwbGFjZShDU3Ry +KFopLCAiKiIsIEFkZGl0aW9uYWxEZWNEaWdpdCkpKSkNCiAgIA0KICAgSWYgTGVm +dChUZXN0U3RyaW5nLCAxKSA9ICItIiBBbmQgKE5vdCBBZGRUb0Fic29sdXRlVmFs +dWUpIFRoZW4NCiAgICAgIEdldE5leHREaWdpdE51bWJlciA9IENEYmwoUmVwbGFj +ZShDU3RyKFopLCAiKiIsIHZiTnVsbFN0cmluZykpDQogICAgICBFeGl0IEZ1bmN0 +aW9uDQogICBFbmQgSWYNCiAgIA0KICAgSWYgTGVmdChUZXN0U3RyaW5nLCAxKSA9 +ICItIiBUaGVuDQogICAgICBJc05lZ2F0aXYgPSBUcnVlDQogICBFbmQgSWYNCiAg +IA0KICAgS29tbWFQb3MgPSBJblN0clJldihUZXN0U3RyaW5nLCBEZWNpbWFsTWFy +a2VyKQ0KICAgSWYgS29tbWFQb3MgPSAwIFRoZW4gJyBuZXh0IGludGVnZXINCiAg +ICAgIElmIEFkZFRvQWJzb2x1dGVWYWx1ZSBBbmQgSXNOZWdhdGl2IFRoZW4NCiAg +ICAgICAgIEdldE5leHREaWdpdE51bWJlciA9IENEYmwoUmVwbGFjZShDU3RyKFop +LCAiKiIsIHZiTnVsbFN0cmluZykpIC0gMQ0KICAgICAgRWxzZQ0KICAgICAgICAg +R2V0TmV4dERpZ2l0TnVtYmVyID0gQ0RibChSZXBsYWNlKENTdHIoWiksICIqIiwg +dmJOdWxsU3RyaW5nKSkgKyAxDQogICAgICBFbmQgSWYNCiAgICAgIEV4aXQgRnVu +Y3Rpb24NCiAgIEVuZCBJZg0KICAgDQogICBkaWdpdHMgPSBMZW4oVGVzdFN0cmlu +ZykgLSBLb21tYVBvcyAtIDENCiAgIA0KICAgSWYgTGVmdChUZXN0U3RyaW5nLCAx +KSA9ICItIiBUaGVuDQogICAgICBJc05lZ2F0aXYgPSBUcnVlDQogICBFbmQgSWYN +CiAgIA0KICAgSWYgQWRkVG9BYnNvbHV0ZVZhbHVlIEFuZCBJc05lZ2F0aXYgVGhl +bg0KICAgICAgR2V0TmV4dERpZ2l0TnVtYmVyID0gQ0RibChUZXN0U3RyaW5nKSAr +IEFkZGl0aW9uYWxEZWNEaWdpdEtvcnIgLyAxMCBeIGRpZ2l0cyAtIEFkZGl0aW9u +YWxEZWNEaWdpdEtvcnIgLyAxMCBeIChkaWdpdHMgLSAxKQ0KICAgRWxzZQ0KICAg +ICAgR2V0TmV4dERpZ2l0TnVtYmVyID0gQ0RibChUZXN0U3RyaW5nKSArICgxIC0g +QWRkaXRpb25hbERlY0RpZ2l0S29ycikgLyAxMCBeIGRpZ2l0cw0KICAgRW5kIElm +DQogICANCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIFByb3BlcnR5IEdldCBEZWNp +bWFsTWFya2VyKCkgQXMgU3RyaW5nDQoNCiAgIFN0YXRpYyBEZWNDaGFyIEFzIFN0 +cmluZw0KICAgRGltIFggQXMgU3RyaW5nDQogICANCiAgIElmIExlbihEZWNDaGFy +KSA9IDAgVGhlbg0KICAgICAgWCA9IFRyaW0oQ1N0cigxLjIpKQ0KICAgICAgRGVj +Q2hhciA9IE1pZChYLCAyLCAxKQ0KICAgRW5kIElmDQogICANCiAgIERlY2ltYWxN +YXJrZXIgPSBEZWNDaGFyDQoNCkVuZCBQcm9wZXJ0eQ0KDQpQcml2YXRlIEZ1bmN0 +aW9uIENoYXJUcmltKEJ5VmFsIFZhbHVlVG9UcmltIEFzIFN0cmluZywgQnlWYWwg +VHJpbUNoYXIgQXMgU3RyaW5nKSBBcyBTdHJpbmcNCg0KICAgRGltIFRyaW1TdHJp +bmcgQXMgU3RyaW5nDQogICANCiAgIFRyaW1TdHJpbmcgPSAiICIgJiBUcmltQ2hh +cg0KICAgRG8gV2hpbGUgSW5TdHIoMSwgVmFsdWVUb1RyaW0sIFRyaW1TdHJpbmcp +DQogICAgICBWYWx1ZVRvVHJpbSA9IFJlcGxhY2UoVmFsdWVUb1RyaW0sIFRyaW1T +dHJpbmcsIFRyaW1DaGFyKQ0KICAgTG9vcA0KICAgDQogICBUcmltU3RyaW5nID0g +VHJpbUNoYXIgJiAiICINCiAgIERvIFdoaWxlIEluU3RyKDEsIFZhbHVlVG9Ucmlt +LCBUcmltU3RyaW5nKQ0KICAgICAgVmFsdWVUb1RyaW0gPSBSZXBsYWNlKFZhbHVl +VG9UcmltLCBUcmltU3RyaW5nLCBUcmltQ2hhcikNCiAgIExvb3ANCiAgIA0KICAg +Q2hhclRyaW0gPSBWYWx1ZVRvVHJpbQ0KDQpFbmQgRnVuY3Rpb24NCg0KRnJpZW5k +IEZ1bmN0aW9uIEdldFJlbGF0aW9uYWxPcGVyYXRvclN0cmluZyhCeVJlZiBSZWxh +dGlvbmFsT3BlcmF0b3IgQXMgU3FsUmVsYXRpb25hbE9wZXJhdG9ycykgQXMgU3Ry +aW5nDQoNCiAgIERpbSBPcGVyYXRvclN0cmluZyBBcyBTdHJpbmcNCiAgIERpbSBv +cCBBcyBTcWxSZWxhdGlvbmFsT3BlcmF0b3JzDQogICANCiAgIElmIChSZWxhdGlv +bmFsT3BlcmF0b3IgQW5kIFNRTF9JbikgPSBTUUxfSW4gVGhlbg0KICAgICAgT3Bl +cmF0b3JTdHJpbmcgPSBPcGVyYXRvclN0cmluZyAmICJJbiINCiAgICAgIElmIChS +ZWxhdGlvbmFsT3BlcmF0b3IgQW5kIFNRTF9Ob3QpID0gU1FMX05vdCBUaGVuDQog +ICAgICAgICBPcGVyYXRvclN0cmluZyA9ICJOb3QgIiAmIE9wZXJhdG9yU3RyaW5n +DQogICAgICBFbmQgSWYNCiAgICAgIEdldFJlbGF0aW9uYWxPcGVyYXRvclN0cmlu +ZyA9IE9wZXJhdG9yU3RyaW5nDQogICAgICBFeGl0IEZ1bmN0aW9uDQogICBFbmQg +SWYNCiAgIA0KICAgSWYgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX05vdCkg +PSBTUUxfTm90IFRoZW4NCiAgICAgIA0KICAgICAgb3AgPSBSZWxhdGlvbmFsT3Bl +cmF0b3IgWG9yIFNRTF9Ob3QNCiAgICAgIA0KICAgICAgSWYgb3AgPSBTcWxSZWxh +dGlvbmFsT3BlcmF0b3JzLlNRTF9FcXVhbCBUaGVuICcgPT4gIj0iIHp1ICI8PiIg +Li4gbnVsbCBiZXL8Y2tzaWNodGlnZW4/DQogICAgICAgICBSZWxhdGlvbmFsT3Bl +cmF0b3IgPSBTUUxfTGVzc1RoYW4gKyBTUUxfR3JlYXRlclRoYW4NCiAgICAgIEVs +c2VJZiBvcCA9IFNRTF9HcmVhdGVyVGhhbiArIFNRTF9MZXNzVGhhbiBUaGVuICcg +PT4gIjw+IiB6dSAiPSIgLi4gbnVsbCBiZXL8Y2tzaWNodGlnZW4/DQogICAgICAg +ICBSZWxhdGlvbmFsT3BlcmF0b3IgPSBTUUxfRXF1YWwNCiAgICAgIEVsc2UNCiAg +ICAgICAgIFJlbGF0aW9uYWxPcGVyYXRvciA9IFJlbGF0aW9uYWxPcGVyYXRvciBY +b3IgU1FMX05vdA0KICAgICAgICAgSWYgKG9wIEFuZCBTUUxfRXF1YWwpID0gU1FM +X0VxdWFsIFRoZW4NCiAgICAgICAgICAgIFJlbGF0aW9uYWxPcGVyYXRvciA9IFJl +bGF0aW9uYWxPcGVyYXRvciBYb3IgU1FMX0VxdWFsDQogICAgICAgICBFbHNlDQog +ICAgICAgICAgICBSZWxhdGlvbmFsT3BlcmF0b3IgPSBSZWxhdGlvbmFsT3BlcmF0 +b3IgT3IgU1FMX0VxdWFsDQogICAgICAgICBFbmQgSWYNCiAgICAgICAgIElmIChv +cCBBbmQgU1FMX0xlc3NUaGFuKSA9IFNRTF9MZXNzVGhhbiBUaGVuDQogICAgICAg +ICAgICBSZWxhdGlvbmFsT3BlcmF0b3IgPSBSZWxhdGlvbmFsT3BlcmF0b3IgWG9y +IFNRTF9MZXNzVGhhbg0KICAgICAgICAgICAgUmVsYXRpb25hbE9wZXJhdG9yID0g +UmVsYXRpb25hbE9wZXJhdG9yIE9yIFNRTF9HcmVhdGVyVGhhbg0KICAgICAgICAg +RW5kIElmDQogICAgICAgICBJZiAob3AgQW5kIFNRTF9HcmVhdGVyVGhhbikgPSBT +UUxfR3JlYXRlclRoYW4gVGhlbg0KICAgICAgICAgICAgUmVsYXRpb25hbE9wZXJh +dG9yID0gUmVsYXRpb25hbE9wZXJhdG9yIFhvciBTUUxfR3JlYXRlclRoYW4NCiAg +ICAgICAgICAgIFJlbGF0aW9uYWxPcGVyYXRvciA9IFJlbGF0aW9uYWxPcGVyYXRv +ciBPciBTUUxfTGVzc1RoYW4NCiAgICAgICAgIEVuZCBJZg0KICAgICAgRW5kIElm +DQogICBFbmQgSWYNCg0KICAgSWYgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FM +X0xlc3NUaGFuKSA9IFNRTF9MZXNzVGhhbiBUaGVuDQogICAgICBPcGVyYXRvclN0 +cmluZyA9IE9wZXJhdG9yU3RyaW5nICYgIjwiDQogICBFbmQgSWYNCiAgIA0KICAg +SWYgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX0dyZWF0ZXJUaGFuKSA9IFNR +TF9HcmVhdGVyVGhhbiBUaGVuDQogICAgICBPcGVyYXRvclN0cmluZyA9IE9wZXJh +dG9yU3RyaW5nICYgIj4iDQogICBFbmQgSWYNCg0KICAgSWYgKFJlbGF0aW9uYWxP +cGVyYXRvciBBbmQgU1FMX0VxdWFsKSA9IFNRTF9FcXVhbCBUaGVuDQogICAgICBP +cGVyYXRvclN0cmluZyA9IE9wZXJhdG9yU3RyaW5nICYgIj0iDQogICBFbmQgSWYN +Cg0KICAgR2V0UmVsYXRpb25hbE9wZXJhdG9yU3RyaW5nID0gT3BlcmF0b3JTdHJp +bmcNCg0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gVHJ5QnVpbGRX +aWxkQ2FyZFN1ZmZpeE9yUHJlQnVpbGRQYXJhbXMoQnlWYWwgRmllbGROYW1lIEFz +IFN0cmluZywgQnlWYWwgRmllbGREYXRhVHlwZSBBcyBTcWxGaWVsZERhdGFUeXBl +LCBfDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJl +ZiBSZWxhdGlvbmFsT3BlcmF0b3IgQXMgU3FsUmVsYXRpb25hbE9wZXJhdG9ycywg +Xw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnlSZWYg +RmlsdGVyVmFsdWUgQXMgVmFyaWFudCwgXw0KICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgQnlSZWYgRmlsdGVyVmFsdWUyIEFzIFZhcmlhbnQs +IF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVm +IElnbm9yZVZhbHVlIEFzIFZhcmlhbnQsIF8NCiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIEJ5UmVmIENyaXRlcmlhIEFzIFN0cmluZykgQXMg +Qm9vbGVhbg0KDQogICBEaW0gQ3JpdGVyaWExIEFzIFN0cmluZw0KICAgRGltIENy +aXRlcmlhMiBBcyBTdHJpbmcNCg0KICAgSWYgKFJlbGF0aW9uYWxPcGVyYXRvciBB +bmQgU1FMX0xpa2UpID0gU1FMX0xpa2UgVGhlbg0KICAgICAgRmlsdGVyVmFsdWUg +PSBGaWx0ZXJWYWx1ZSAmIFNxbFdpbGRDYXJkU3RyaW5nDQogICBFbHNlSWYgKEZp +ZWxkRGF0YVR5cGUgQW5kIFNRTF9EYXRlKSA9IFNRTF9EYXRlIFRoZW4NCiAgICAg +IElmIChSZWxhdGlvbmFsT3BlcmF0b3IgQW5kIFNRTF9MZXNzVGhhbikgPSAwIFRo +ZW4gJyBubyA8IHRoZXJlZm9yZTogID4sID49IG9yIG9ubHkgPQ0KICAgICAgICAg +SWYgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX0dyZWF0ZXJUaGFuKSA9IFNR +TF9HcmVhdGVyVGhhbiBUaGVuDQogICAgICAgICAgICAnIGNoYW5nZSBub3RoaW5n +IC4uLiA+PSBEYXRhVmFsdWUgIC8gU1FMX0FkZF9XaWxkQ2FyZFN1ZmZpeCBpcyBu +b3QgbG9naWNhbA0KICAgICAgICAgRWxzZSAnIENvbnNpZGVyIHRoZSB3aG9sZSBk +YXkgLi4uIEZpZWxkTmFtZSA+PSBEYXRlVmFsdWUgYW5kIEZpZWxkTmFtZSA8IERh +dGVBZGQoImQiLCAxLCBGaWx0ZXJWYWx1ZSkpDQogICAgICAgICAgICBDcml0ZXJp +YSA9IEJ1aWxkQ3JpdGVyaWEoRmllbGROYW1lLCBGaWVsZERhdGFUeXBlLCBTUUxf +R3JlYXRlclRoYW4gKyBTUUxfRXF1YWwsIEZpbHRlclZhbHVlLCAsICwgRmFsc2Up +ICYgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNxbEFuZENvbmNhdFN0 +cmluZyAmIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsZENyaXRl +cmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlwZSwgU1FMX0xlc3NUaGFuLCBEYXRl +QWRkKCJkIiwgMSwgQ0RhdGUoQ0xuZyhGaWx0ZXJWYWx1ZSkpKSwgLCAsIEZhbHNl +KQ0KICAgICAgICAgICAgVHJ5QnVpbGRXaWxkQ2FyZFN1ZmZpeE9yUHJlQnVpbGRQ +YXJhbXMgPSBUcnVlDQogICAgICAgICAgICBFeGl0IEZ1bmN0aW9uDQogICAgICAg +ICBFbmQgSWYNCiAgICAgIEVsc2UNCiAgICAgICAgIElmIChSZWxhdGlvbmFsT3Bl +cmF0b3IgQW5kIFNRTF9FcXVhbCkgPSBTUUxfRXF1YWwgVGhlbg0KICAgICAgICAg +ICAgUmVsYXRpb25hbE9wZXJhdG9yID0gUmVsYXRpb25hbE9wZXJhdG9yIC0gU1FM +X0VxdWFsDQogICAgICAgICBFbmQgSWYNCiAgICAgICAgIEZpbHRlclZhbHVlID0g +RGF0ZUFkZCgiZCIsIDEsIENEYXRlKENMbmcoRmlsdGVyVmFsdWUpKSkNCiAgICAg +IEVuZCBJZg0KICAgRWxzZUlmIChGaWVsZERhdGFUeXBlIEFuZCBTUUxfTnVtZXJp +YykgPSBTUUxfTnVtZXJpYyBUaGVuDQogICAgICBJZiAoUmVsYXRpb25hbE9wZXJh +dG9yIEFuZCBTUUxfTGVzc1RoYW4pID0gMCBUaGVuICcgbm8gPCBkYWhlcjogID4s +ID49IG9yIG9ubHkgPQ0KICAgICAgICAgSWYgKFJlbGF0aW9uYWxPcGVyYXRvciBB +bmQgU1FMX0dyZWF0ZXJUaGFuKSA9IFNRTF9HcmVhdGVyVGhhbiBUaGVuDQogICAg +ICAgICAgICBJZiBGaWx0ZXJWYWx1ZSBMaWtlICIqWywuXSpbKl0iIFRoZW4NCiAg +ICAgICAgICAgICAgIEZpbHRlclZhbHVlID0gUmVwbGFjZShGaWx0ZXJWYWx1ZSwg +IioiLCAwKQ0KICAgICAgICAgICAgRWxzZUlmIEZpbHRlclZhbHVlIExpa2UgIipb +Kl0iIFRoZW4NCiAgICAgICAgICAgICAgIEZpbHRlclZhbHVlID0gUmVwbGFjZShG +aWx0ZXJWYWx1ZSwgIioiLCB2Yk51bGxTdHJpbmcpDQogICAgICAgICAgICBFbmQg +SWYNCiAgICAgICAgICAgICcgY2hhbmdlIG5vdGhpbmcgPT4gPj0gTnVtYmVyICAv +IFNRTF9BZGRfV2lsZENhcmRTdWZmaXggaXMgbm90IGxvZ2ljYWwNCiAgICAgICAg +IEVsc2UgJyBDb25zaWRlciBmb2xsb3dpbmcgZGVjaW1hbCB2YWx1ZXMgLi4uIEZp +ZWxkTmFtZSA+PSBOdW1iZXIgYW5kIEZpZWxkTmFtZSA8IChOdW1iZXIgKyB4KQ0K +ICAgICAgICAgICAgSWYgRmlsdGVyVmFsdWUgTGlrZSAiLSpbKl0iIFRoZW4NCiAg +ICAgICAgICAgICAgIElmIEZpbHRlclZhbHVlIExpa2UgIipbLC5dKlsqXSIgVGhl +bg0KICAgICAgICAgICAgICAgICAgRmlsdGVyVmFsdWUyID0gUmVwbGFjZShGaWx0 +ZXJWYWx1ZSwgIioiLCAwKQ0KICAgICAgICAgICAgICAgRWxzZQ0KICAgICAgICAg +ICAgICAgICAgRmlsdGVyVmFsdWUyID0gUmVwbGFjZShGaWx0ZXJWYWx1ZSwgIioi +LCB2Yk51bGxTdHJpbmcpDQogICAgICAgICAgICAgICBFbmQgSWYNCiAgICAgICAg +ICAgICAgIENyaXRlcmlhMSA9IEJ1aWxkQ3JpdGVyaWEoRmllbGROYW1lLCBGaWVs +ZERhdGFUeXBlLCBTUUxfR3JlYXRlclRoYW4sIEdldE5leHREaWdpdE51bWJlcihG +aWx0ZXJWYWx1ZSwgVHJ1ZSksICwgTnVsbCwgRmFsc2UpDQogICAgICAgICAgICAg +ICBDcml0ZXJpYTIgPSBCdWlsZENyaXRlcmlhKEZpZWxkTmFtZSwgRmllbGREYXRh +VHlwZSwgU1FMX0xlc3NUaGFuICsgU1FMX0VxdWFsLCBGaWx0ZXJWYWx1ZTIsICwg +TnVsbCwgRmFsc2UpDQogICAgICAgICAgICBFbHNlDQogICAgICAgICAgICAgICBD +cml0ZXJpYTEgPSBCdWlsZENyaXRlcmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlw +ZSwgU1FMX0dyZWF0ZXJUaGFuICsgU1FMX0VxdWFsLCBGaWx0ZXJWYWx1ZSwgLCBO +dWxsLCBGYWxzZSkNCiAgICAgICAgICAgICAgIENyaXRlcmlhMiA9IEJ1aWxkQ3Jp +dGVyaWEoRmllbGROYW1lLCBGaWVsZERhdGFUeXBlLCBTUUxfTGVzc1RoYW4sIEdl +dE5leHREaWdpdE51bWJlcihGaWx0ZXJWYWx1ZSksICwgTnVsbCwgRmFsc2UpDQog +ICAgICAgICAgICBFbmQgSWYNCiAgICAgICAgICAgIENyaXRlcmlhID0gQ3JpdGVy +aWExICYgU3FsQW5kQ29uY2F0U3RyaW5nICYgQ3JpdGVyaWEyDQogICAgICAgICAg +ICBUcnlCdWlsZFdpbGRDYXJkU3VmZml4T3JQcmVCdWlsZFBhcmFtcyA9IFRydWUN +CiAgICAgICAgICAgIEV4aXQgRnVuY3Rpb24NCiAgICAgICAgIEVuZCBJZg0KICAg +ICAgRWxzZQ0KICAgICAgICAgSWYgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FM +X0VxdWFsKSA9IFNRTF9FcXVhbCBUaGVuDQogICAgICAgICAgICBSZWxhdGlvbmFs +T3BlcmF0b3IgPSBSZWxhdGlvbmFsT3BlcmF0b3IgLSBTUUxfRXF1YWwNCiAgICAg +ICAgIEVuZCBJZg0KICAgICAgICAgRmlsdGVyVmFsdWUgPSBHZXROZXh0RGlnaXRO +dW1iZXIoRmlsdGVyVmFsdWUpDQogICAgICBFbmQgSWYNCiAgIEVuZCBJZg0KDQpF +bmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBUcnlCdWlsZE51bWVyaWNT +cGVjaWFsQ2FzZXNDcml0ZXJpYShCeVJlZiBGaWVsZE5hbWUgQXMgU3RyaW5nLCBC +eVZhbCBGaWVsZERhdGFUeXBlIEFzIFNxbEZpZWxkRGF0YVR5cGUsIF8NCiAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVmIFJlbGF0aW9u +YWxPcGVyYXRvciBBcyBTcWxSZWxhdGlvbmFsT3BlcmF0b3JzLCBfDQogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJlZiBGaWx0ZXJWYWx1 +ZSBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICBCeVJlZiBJZ25vcmVWYWx1ZSBBcyBWYXJpYW50LCBfDQogICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJlZiBEaXNhYmxlSWdu +b3JlTnVsbFZhbHVlIEFzIEJvb2xlYW4sIF8NCiAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgIEJ5UmVmIENyaXRlcmlhIEFzIFN0cmluZykgQXMg +Qm9vbGVhbg0KDQogICBEaW0gQ3JpdGVyaWFCdWlsZCBBcyBCb29sZWFuDQogICBE +aW0gVGVtcEFycigpIEFzIFN0cmluZw0KICAgDQogICBDb25zdCBGaWx0ZXJWYWx1 +ZTIgQXMgVmFyaWFudCA9IE51bGwNCg0KICAgRmlsdGVyVmFsdWUgPSBUcmltKEZp +bHRlclZhbHVlKQ0KICAgICAgICAgICAgDQogICBJZiBGaWx0ZXJWYWx1ZSBMaWtl +ICJbMC05XSouLipbMC05XSoiIE9yIEZpbHRlclZhbHVlIExpa2UgIlsrLV1bMC05 +XSouLipbMC05XSoiIFRoZW4NCiAgICAgIFRlbXBBcnIgPSBTcGxpdChGaWx0ZXJW +YWx1ZSwgIi4uIikNCiAgICAgIENyaXRlcmlhID0gQnVpbGRDcml0ZXJpYShGaWVs +ZE5hbWUsIEZpZWxkRGF0YVR5cGUsIFNRTF9CZXR3ZWVuLCBUcmltKFRlbXBBcnIo +MCkpLCBUcmltKFRlbXBBcnIoMSkpLCBJZ25vcmVWYWx1ZSwgRGlzYWJsZUlnbm9y +ZU51bGxWYWx1ZSkNCiAgICAgIENyaXRlcmlhQnVpbGQgPSBUcnVlDQogICBFbHNl +SWYgRmlsdGVyVmFsdWUgTGlrZSAiWzAtOV0qLSpbMC05XSoiIE9yIEZpbHRlclZh +bHVlIExpa2UgIlsrLV1bMC05XSotKlswLTldKiIgVGhlbiAgICAnIGNvbnZlcnQg +dG8gYS4uYg0KICAgICAgSWYgTGVmdChGaWx0ZXJWYWx1ZSwgMSkgPSAiLSIgVGhl +bg0KICAgICAgICAgRmlsdGVyVmFsdWUgPSAie019IiAmIE1pZChGaWx0ZXJWYWx1 +ZSwgMikNCiAgICAgIEVuZCBJZg0KICAgICAgRmlsdGVyVmFsdWUgPSBSZXBsYWNl +KEZpbHRlclZhbHVlLCAiICAiLCAiICIpDQogICAgICBGaWx0ZXJWYWx1ZSA9IFJl +cGxhY2UoRmlsdGVyVmFsdWUsICItIC0iLCAiLS0iKQ0KICAgICAgRmlsdGVyVmFs +dWUgPSBSZXBsYWNlKEZpbHRlclZhbHVlLCAiLS0iLCAiLXtNfSIpDQogICAgICBG +aWx0ZXJWYWx1ZSA9IFJlcGxhY2UoRmlsdGVyVmFsdWUsICItIiwgIi4uIikNCiAg +ICAgIEZpbHRlclZhbHVlID0gUmVwbGFjZShGaWx0ZXJWYWx1ZSwgIntNfSIsICIt +IikNCiAgICAgIA0KICAgICAgVGVtcEFyciA9IFNwbGl0KEZpbHRlclZhbHVlLCAi +Li4iKQ0KICAgICAgQ3JpdGVyaWEgPSBCdWlsZENyaXRlcmlhKEZpZWxkTmFtZSwg +RmllbGREYXRhVHlwZSwgU1FMX0JldHdlZW4sIFRyaW0oVGVtcEFycigwKSksIFRy +aW0oVGVtcEFycigxKSksIElnbm9yZVZhbHVlLCBEaXNhYmxlSWdub3JlTnVsbFZh +bHVlKQ0KICAgICAgQ3JpdGVyaWFCdWlsZCA9IFRydWUNCiAgIEVsc2VJZiBGaWx0 +ZXJWYWx1ZSBMaWtlICIqWzAtOV0iICYgRGVjaW1hbE1hcmtlciAmICIqWypdIiBU +aGVuDQogICAgICBJZiAoUmVsYXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfQWRkX1dp +bGRDYXJkU3VmZml4KSA9IDAgVGhlbg0KICAgICAgICAgQ3JpdGVyaWEgPSBCdWls +ZENyaXRlcmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlwZSwgUmVsYXRpb25hbE9w +ZXJhdG9yICsgU1FMX0FkZF9XaWxkQ2FyZFN1ZmZpeCwgRmlsdGVyVmFsdWUsIEZp +bHRlclZhbHVlMiwgSWdub3JlVmFsdWUsIERpc2FibGVJZ25vcmVOdWxsVmFsdWUp +DQogICAgICAgICBDcml0ZXJpYUJ1aWxkID0gVHJ1ZQ0KICAgICAgRW5kIElmDQog +ICBFbmQgSWYNCiAgIA0KICAgVHJ5QnVpbGROdW1lcmljU3BlY2lhbENhc2VzQ3Jp +dGVyaWEgPSBDcml0ZXJpYUJ1aWxkDQoNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRl +IEZ1bmN0aW9uIFRyeUJ1aWxkQXJyYXlDcml0ZXJpYShCeVJlZiBGaWVsZE5hbWUg +QXMgU3RyaW5nLCBCeVZhbCBGaWVsZERhdGFUeXBlIEFzIFNxbEZpZWxkRGF0YVR5 +cGUsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5 +UmVmIFJlbGF0aW9uYWxPcGVyYXRvciBBcyBTcWxSZWxhdGlvbmFsT3BlcmF0b3Jz +LCBfDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJl +ZiBGaWx0ZXJWYWx1ZSBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICBCeVJlZiBJZ25vcmVWYWx1ZSBBcyBWYXJpYW50 +LCBfDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJl +ZiBDcml0ZXJpYSBBcyBTdHJpbmcpIEFzIEJvb2xlYW4NCiAgIERpbSBpdG0gQXMg +VmFyaWFudA0KICAgRGltIEl0bUNyaXRlcmlhIEFzIFN0cmluZw0KICAgDQogICBE +aW0gYXJyRmlsdGVyVmFsdWUoKSBBcyBWYXJpYW50DQogICANCiAgIElmIE5vdCBJ +c0FycmF5KEZpbHRlclZhbHVlKSBUaGVuDQogICAgICBFeGl0IEZ1bmN0aW9uDQog +ICBFbmQgSWYNCg0KICAgJ0Nvbm5lY3QgY3JpdGVyaWEgdmlhIE9yDQogICBGb3Ig +RWFjaCBpdG0gSW4gRmlsdGVyVmFsdWUNCiAgICAgIEl0bUNyaXRlcmlhID0gQnVp +bGRDcml0ZXJpYShGaWVsZE5hbWUsIEZpZWxkRGF0YVR5cGUsIFJlbGF0aW9uYWxP +cGVyYXRvciwgaXRtLCAsIElnbm9yZVZhbHVlLCBGYWxzZSkNCiAgICAgIElmIExl +bihJdG1Dcml0ZXJpYSkgPiAwIFRoZW4NCiAgICAgICAgIENyaXRlcmlhID0gQ3Jp +dGVyaWEgJiBTcWxPckNvbmNhdFN0cmluZyAmIEl0bUNyaXRlcmlhDQogICAgICBF +bmQgSWYNCiAgIE5leHQNCiAgIElmIExlbihDcml0ZXJpYSkgPiAwIFRoZW4NCiAg +ICAgIENyaXRlcmlhID0gTWlkKENyaXRlcmlhLCBMZW4oU3FsT3JDb25jYXRTdHJp +bmcpICsgMSkgJyAxLiBPciB3ZWdzY2huZWlkZW4NCiAgIEVuZCBJZg0KDQogICBU +cnlCdWlsZEFycmF5Q3JpdGVyaWEgPSBUcnVlDQoNCkVuZCBGdW5jdGlvbg0KDQpQ +cml2YXRlIEZ1bmN0aW9uIFRyeUJ1aWxkSW5Dcml0ZXJpYShCeVJlZiBGaWVsZE5h +bWUgQXMgU3RyaW5nLCBCeVZhbCBGaWVsZERhdGFUeXBlIEFzIFNxbEZpZWxkRGF0 +YVR5cGUsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5 +UmVmIFJlbGF0aW9uYWxPcGVyYXRvciBBcyBTcWxSZWxhdGlvbmFsT3BlcmF0b3Jz +LCBfDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJlZiBG +aWx0ZXJWYWx1ZSBBcyBWYXJpYW50LCBfDQogICAgICAgICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICBCeVJlZiBJZ25vcmVWYWx1ZSBBcyBWYXJpYW50LCBfDQog +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJlZiBDcml0ZXJp +YSBBcyBTdHJpbmcpIEFzIEJvb2xlYW4NCg0KICAgRGltIE9wZXJhdG9yU3RyaW5n +IEFzIFN0cmluZw0KICAgRGltIEZpbHRlclZhbHVlU3RyaW5nIEFzIFN0cmluZw0K +DQogICBJZiAoUmVsYXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfSW4pID0gMCBUaGVu +DQogICAgICBFeGl0IEZ1bmN0aW9uDQogICBFbmQgSWYNCg0KICAgSWYgSXNBcnJh +eShGaWx0ZXJWYWx1ZSkgVGhlbg0KICAgICAgRmlsdGVyVmFsdWVTdHJpbmcgPSBH +ZXRWYWx1ZUFycmF5U3RyaW5nKEZpbHRlclZhbHVlLCBGaWVsZERhdGFUeXBlLCAi +LCIsIElnbm9yZVZhbHVlKQ0KICAgRWxzZUlmIFZhclR5cGUoRmlsdGVyVmFsdWUp +ID0gdmJTdHJpbmcgVGhlbg0KICAgICAgSWYgRmllbGREYXRhVHlwZSA9IFNRTF9U +ZXh0IFRoZW4NCiAgICAgICAgIElmIExlZnQoRmlsdGVyVmFsdWUsIDEpID0gIici +IFRoZW4gJyBJcyBhbHJlYWR5IGFzIFNRTCB0ZXh0IGluIHRoZSBGaWx0ZXJTdHJp +bmcNCiAgICAgICAgICAgIEZpbHRlclZhbHVlU3RyaW5nID0gRmlsdGVyVmFsdWUN +CiAgICAgICAgIEVsc2UNCiAgICAgICAgICAgIEZpbHRlclZhbHVlU3RyaW5nID0g +Q29udmVydFRvU3FsVGV4dChGaWx0ZXJWYWx1ZSwgRmllbGREYXRhVHlwZSkNCiAg +ICAgICAgIEVuZCBJZg0KICAgICAgRWxzZQ0KICAgICAgICAgRmlsdGVyVmFsdWVT +dHJpbmcgPSBGaWx0ZXJWYWx1ZSAnIFZhbHVlIGlzIGFscmVhZHkgaW4gdGhlIGxp +c3RpbmcgYXMgYSBzdHJpbmcNCiAgICAgIEVuZCBJZg0KICAgRWxzZQ0KICAgICAg +RmlsdGVyVmFsdWVTdHJpbmcgPSBDb252ZXJ0VG9TcWxUZXh0KEZpbHRlclZhbHVl +LCBGaWVsZERhdGFUeXBlKQ0KICAgRW5kIElmDQoNCiAgIE9wZXJhdG9yU3RyaW5n +ID0gIiBJbiAiDQogICBJZiAoUmVsYXRpb25hbE9wZXJhdG9yIEFuZCBTUUxfTm90 +KSA9IFNRTF9Ob3QgVGhlbg0KICAgICAgT3BlcmF0b3JTdHJpbmcgPSAiIE5vdCIg +JiBPcGVyYXRvclN0cmluZw0KICAgRW5kIElmDQoNCiAgIElmIExlbihGaWx0ZXJW +YWx1ZVN0cmluZykgPiAwIFRoZW4NCiAgIA0KICAgICAgSWYgUmVtb3ZlTnVsbEZy +b21JblZhbHVlU3RyaW5nKEZpbHRlclZhbHVlU3RyaW5nKSBUaGVuDQogICAgICAg +ICBDcml0ZXJpYSA9IEZpZWxkTmFtZSAmICIgSXMgTnVsbCINCiAgICAgICAgIElm +IExlbihGaWx0ZXJWYWx1ZVN0cmluZykgPiAwIFRoZW4NCiAgICAgICAgICAgIENy +aXRlcmlhID0gQ3JpdGVyaWEgJiAiIE9yICIgJiBGaWVsZE5hbWUgJiBPcGVyYXRv +clN0cmluZyAmICIoIiAmIEZpbHRlclZhbHVlU3RyaW5nICYgIikiDQogICAgICAg +ICBFbmQgSWYNCiAgICAgIEVsc2UNCiAgICAgICAgIENyaXRlcmlhID0gRmllbGRO +YW1lICYgT3BlcmF0b3JTdHJpbmcgJiAiKCIgJiBGaWx0ZXJWYWx1ZVN0cmluZyAm +ICIpIg0KICAgICAgRW5kIElmDQogICAgDQogICBFbmQgSWYNCg0KICAgVHJ5QnVp +bGRJbkNyaXRlcmlhID0gVHJ1ZQ0KDQpFbmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBG +dW5jdGlvbiBUcnlCdWlsZEJldHdlZW5Dcml0ZXJpYShCeVJlZiBGaWVsZE5hbWUg +QXMgU3RyaW5nLCBCeVZhbCBGaWVsZERhdGFUeXBlIEFzIFNxbEZpZWxkRGF0YVR5 +cGUsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +QnlSZWYgUmVsYXRpb25hbE9wZXJhdG9yIEFzIFNxbFJlbGF0aW9uYWxPcGVyYXRv +cnMsIF8NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +QnlSZWYgRmlsdGVyVmFsdWUgQXMgVmFyaWFudCwgXw0KICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICBCeVJlZiBGaWx0ZXJWYWx1ZTIgQXMg +VmFyaWFudCwgXw0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg +ICAgICBCeVJlZiBJZ25vcmVWYWx1ZSBBcyBWYXJpYW50LCBfDQogICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVmIENyaXRlcmlhIEFz +IFN0cmluZykgQXMgQm9vbGVhbg0KICAgDQogICBEaW0gQ3JpdGVyaWExIEFzIFN0 +cmluZw0KICAgRGltIENyaXRlcmlhMiBBcyBTdHJpbmcNCiAgIA0KICAgSWYgKFJl +bGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX0JldHdlZW4pID0gRmFsc2UgVGhlbg0K +ICAgICAgVHJ5QnVpbGRCZXR3ZWVuQ3JpdGVyaWEgPSBGYWxzZQ0KICAgICAgRXhp +dCBGdW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIElmIChSZWxhdGlvbmFsT3Bl +cmF0b3IgQW5kIFNRTF9Ob3QpID0gU1FMX05vdCBUaGVuICdSZXZlcnNlIGNvbmRp +dGlvbg0KICAgICAgQ3JpdGVyaWExID0gQnVpbGRDcml0ZXJpYShGaWVsZE5hbWUs +IEZpZWxkRGF0YVR5cGUsIFNRTF9MZXNzVGhhbiwgRmlsdGVyVmFsdWUsICwgSWdu +b3JlVmFsdWUsIEZhbHNlKQ0KICAgICAgQ3JpdGVyaWEyID0gQnVpbGRDcml0ZXJp +YShGaWVsZE5hbWUsIEZpZWxkRGF0YVR5cGUsIFNRTF9HcmVhdGVyVGhhbiwgRmls +dGVyVmFsdWUyLCAsIElnbm9yZVZhbHVlLCBGYWxzZSkNCiAgICAgIENyaXRlcmlh +ID0gQ3JpdGVyaWExICYgU3FsQW5kQ29uY2F0U3RyaW5nICYgQ3JpdGVyaWEyDQog +ICAgICBUcnlCdWlsZEJldHdlZW5Dcml0ZXJpYSA9IFRydWUNCiAgICAgIEV4aXQg +RnVuY3Rpb24NCiAgIEVuZCBJZg0KICAgDQogICBJZiBGaWVsZERhdGFUeXBlID0g +U1FMX051bWVyaWMgVGhlbg0KICAgICAgSWYgRmlsdGVyVmFsdWUyIExpa2UgIjw9 +KiIgVGhlbiAnY3V0IGF3YXkNCiAgICAgICAgIEZpbHRlclZhbHVlMiA9IE1pZChG +aWx0ZXJWYWx1ZTIsIDMpDQogICAgICBFbHNlSWYgRmlsdGVyVmFsdWUyIExpa2Ug +IjwqIiBUaGVuDQogICAgICAgICBGaWx0ZXJWYWx1ZTIgPSBNaWQoRmlsdGVyVmFs +dWUyLCAyKQ0KICAgICAgICAgQ3JpdGVyaWExID0gQnVpbGRDcml0ZXJpYShGaWVs +ZE5hbWUsIEZpZWxkRGF0YVR5cGUsIFNRTF9HcmVhdGVyVGhhbiArIFNRTF9FcXVh +bCwgRmlsdGVyVmFsdWUsICwgTnVsbCwgRmFsc2UpDQogICAgICAgICBDcml0ZXJp +YTIgPSBCdWlsZENyaXRlcmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlwZSwgU1FM +X0xlc3NUaGFuLCBGaWx0ZXJWYWx1ZTIsICwgTnVsbCwgRmFsc2UpDQogICAgICAg +ICBDcml0ZXJpYSA9IENyaXRlcmlhMSAmIFNxbEFuZENvbmNhdFN0cmluZyAmIENy +aXRlcmlhMg0KICAgICAgICAgVHJ5QnVpbGRCZXR3ZWVuQ3JpdGVyaWEgPSBUcnVl +DQogICAgICAgICBFeGl0IEZ1bmN0aW9uDQogICAgICBFbmQgSWYNCiAgIEVuZCBJ +Zg0KDQogICBJZiBJc051bGwoRmlsdGVyVmFsdWUyKSBPciBJc01pc3NpbmcoRmls +dGVyVmFsdWUyKSBPciBWYWx1ZXNBcmVFcXVhbChGaWVsZERhdGFUeXBlLCBGaWx0 +ZXJWYWx1ZTIsIElnbm9yZVZhbHVlKSBUaGVuDQogICAgICBSZWxhdGlvbmFsT3Bl +cmF0b3IgPSBTUUxfR3JlYXRlclRoYW4gKyBTUUxfRXF1YWwNCiAgIEVsc2VJZiBJ +c051bGwoRmlsdGVyVmFsdWUpIE9yIFZhbHVlc0FyZUVxdWFsKEZpZWxkRGF0YVR5 +cGUsIEZpbHRlclZhbHVlLCBJZ25vcmVWYWx1ZSkgVGhlbg0KICAgICAgUmVsYXRp +b25hbE9wZXJhdG9yID0gU1FMX0xlc3NUaGFuICsgU1FMX0VxdWFsDQogICAgICBG +aWx0ZXJWYWx1ZSA9IEZpbHRlclZhbHVlMg0KICAgICAgRmlsdGVyVmFsdWUyID0g +R2V0Q2hlY2tlZElnbm9yZVZhbHVlKElnbm9yZVZhbHVlKQ0KICAgRWxzZUlmIChG +aWVsZERhdGFUeXBlIEFuZCBTUUxfRGF0ZSkgPSBTUUxfRGF0ZSBBbmQgKFJlbGF0 +aW9uYWxPcGVyYXRvciBBbmQgU1FMX0FkZF9XaWxkQ2FyZFN1ZmZpeCkgVGhlbg0K +ICAgICAgQ3JpdGVyaWExID0gQnVpbGRDcml0ZXJpYShGaWVsZE5hbWUsIEZpZWxk +RGF0YVR5cGUsIFNRTF9HcmVhdGVyVGhhbiArIFNRTF9FcXVhbCwgRmlsdGVyVmFs +dWUsICwgTnVsbCwgRmFsc2UpDQogICAgICBDcml0ZXJpYTIgPSBCdWlsZENyaXRl +cmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlwZSwgU1FMX0xlc3NUaGFuICsgU1FM +X0VxdWFsICsgU1FMX0FkZF9XaWxkQ2FyZFN1ZmZpeCwgRmlsdGVyVmFsdWUyLCAs +IE51bGwsIEZhbHNlKQ0KICAgICAgQ3JpdGVyaWEgPSBDcml0ZXJpYTEgJiBTcWxB +bmRDb25jYXRTdHJpbmcgJiBDcml0ZXJpYTINCiAgICAgIFRyeUJ1aWxkQmV0d2Vl +bkNyaXRlcmlhID0gVHJ1ZQ0KICAgICAgRXhpdCBGdW5jdGlvbg0KICAgRWxzZUlm +IChGaWVsZERhdGFUeXBlIEFuZCBTUUxfTnVtZXJpYykgPSBTUUxfTnVtZXJpYyBB +bmQgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX0FkZF9XaWxkQ2FyZFN1ZmZp +eCkgVGhlbg0KICAgICAgQ3JpdGVyaWExID0gQnVpbGRDcml0ZXJpYShGaWVsZE5h +bWUsIEZpZWxkRGF0YVR5cGUsIFNRTF9HcmVhdGVyVGhhbiArIFNRTF9FcXVhbCwg +RmlsdGVyVmFsdWUsICwgTnVsbCwgRmFsc2UpDQogICAgICBDcml0ZXJpYTIgPSBC +dWlsZENyaXRlcmlhKEZpZWxkTmFtZSwgRmllbGREYXRhVHlwZSwgU1FMX0xlc3NU +aGFuICsgU1FMX0VxdWFsICsgU1FMX0FkZF9XaWxkQ2FyZFN1ZmZpeCwgRmlsdGVy +VmFsdWUyLCAsIE51bGwsIEZhbHNlKQ0KICAgICAgQ3JpdGVyaWEgPSBDcml0ZXJp +YTEgJiBTcWxBbmRDb25jYXRTdHJpbmcgJiBDcml0ZXJpYTINCiAgICAgIFRyeUJ1 +aWxkQmV0d2VlbkNyaXRlcmlhID0gVHJ1ZQ0KICAgICAgRXhpdCBGdW5jdGlvbg0K +ICAgRWxzZQ0KICAgICAgQ3JpdGVyaWEgPSBGaWVsZE5hbWUgJiAiIEJldHdlZW4g +IiAmIENvbnZlcnRUb1NxbFRleHQoRmlsdGVyVmFsdWUsIEZpZWxkRGF0YVR5cGUp +ICYgU3FsQW5kQ29uY2F0U3RyaW5nICYgQ29udmVydFRvU3FsVGV4dChGaWx0ZXJW +YWx1ZTIsIEZpZWxkRGF0YVR5cGUpDQogICAgICBUcnlCdWlsZEJldHdlZW5Dcml0 +ZXJpYSA9IFRydWUNCiAgICAgIEV4aXQgRnVuY3Rpb24NCiAgIEVuZCBJZg0KDQpF +bmQgRnVuY3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBHZXRDaGVja2VkSWdub3Jl +VmFsdWUoQnlWYWwgSWdub3JlVmFsdWUgQXMgVmFyaWFudCkgQXMgVmFyaWFudA0K +ICAgSWYgSXNBcnJheShJZ25vcmVWYWx1ZSkgVGhlbg0KICAgICAgR2V0Q2hlY2tl +ZElnbm9yZVZhbHVlID0gSWdub3JlVmFsdWUoTEJvdW5kKElnbm9yZVZhbHVlKSkN +CiAgIEVsc2UNCiAgICAgIEdldENoZWNrZWRJZ25vcmVWYWx1ZSA9IElnbm9yZVZh +bHVlDQogICBFbmQgSWYNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0aW9u +IE51bGxGaWx0ZXJPckVtcHR5RmlsdGVyKEJ5VmFsIEZpZWxkTmFtZSBBcyBTdHJp +bmcsIEJ5VmFsIEZpZWxkRGF0YVR5cGUgQXMgU3FsRmllbGREYXRhVHlwZSwgXw0K +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBS +ZWxhdGlvbmFsT3BlcmF0b3IgQXMgU3FsUmVsYXRpb25hbE9wZXJhdG9ycywgXw0K +ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeVZhbCBW +YWx1ZSBBcyBWYXJpYW50LCBCeVZhbCBJZ25vcmVWYWx1ZSBBcyBWYXJpYW50LCBf +DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5UmVm +IE51bGxGaWx0ZXJTdHJpbmcgQXMgU3RyaW5nLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgIE9wdGlvbmFsIEJ5VmFsIERpc2FibGVJZ25vcmVOdWxs +VmFsdWUgQXMgQm9vbGVhbiA9IEZhbHNlKSBBcyBCb29sZWFuDQogICANCiAgIElm +IElzT2JqZWN0KElnbm9yZVZhbHVlKSBUaGVuDQogICBJZiBJZ25vcmVWYWx1ZSBJ +cyBOb3RoaW5nIFRoZW4NCiAgICAgIElmIElzTnVsbChWYWx1ZSkgVGhlbg0KICAg +ICAgICAgSWYgKFJlbGF0aW9uYWxPcGVyYXRvciBBbmQgU1FMX05vdCkgPSBTUUxf +Tm90IFRoZW4NCiAgICAgICAgICAgIE51bGxGaWx0ZXJTdHJpbmcgPSBGaWVsZE5h +bWUgJiAiIElzIE5vdCBOdWxsIg0KICAgICAgICAgRWxzZQ0KICAgICAgICAgICAg +TnVsbEZpbHRlclN0cmluZyA9IEZpZWxkTmFtZSAmICIgSXMgTnVsbCINCiAgICAg +ICAgIEVuZCBJZg0KICAgICAgICAgTnVsbEZpbHRlck9yRW1wdHlGaWx0ZXIgPSBU +cnVlDQogICAgICBFbHNlDQogICAgICAgICBOdWxsRmlsdGVyT3JFbXB0eUZpbHRl +ciA9IEZhbHNlDQogICAgICBFbmQgSWYNCiAgICAgIEV4aXQgRnVuY3Rpb24NCiAg +IEVuZCBJZg0KICAgRW5kIElmDQogICANCiAgIElmIElzTnVsbChWYWx1ZSkgVGhl +bg0KICAgICAgSWYgRGlzYWJsZUlnbm9yZU51bGxWYWx1ZSBUaGVuDQogICAgICAg +ICBOdWxsRmlsdGVyU3RyaW5nID0gRmllbGROYW1lICYgIiBJcyBOdWxsIg0KICAg +ICAgRWxzZUlmIE5vdCBWYWx1ZXNBcmVFcXVhbChGaWVsZERhdGFUeXBlLCBWYWx1 +ZSwgSWdub3JlVmFsdWUpIFRoZW4NCiAgICAgICAgIE51bGxGaWx0ZXJTdHJpbmcg +PSBGaWVsZE5hbWUgJiAiIElzIE51bGwiDQogICAgICBFbmQgSWYNCiAgICAgIE51 +bGxGaWx0ZXJPckVtcHR5RmlsdGVyID0gVHJ1ZQ0KICAgRWxzZUlmIElzQXJyYXko +VmFsdWUpIFRoZW4NCiAgICAgIERpbSBDaGVja0FycmF5KCkgQXMgVmFyaWFudA0K +T24gRXJyb3IgUmVzdW1lIE5leHQNCiAgICAgIENoZWNrQXJyYXkgPSBWYWx1ZQ0K +ICAgICAgSWYgRXJyLk51bWJlciA9IDAgVGhlbg0KICAgICAgSWYgKDAgLyAxKSAr +IChOb3QgTm90IENoZWNrQXJyYXkpID0gMCBUaGVuDQogICAgICAgICBOdWxsRmls +dGVyT3JFbXB0eUZpbHRlciA9IFRydWUNCiAgICAgICAgIEV4aXQgRnVuY3Rpb24N +CiAgICAgIEVuZCBJZg0KICAgICAgRWxzZQ0KICAgICAgICAgRXJyLkNsZWFyDQog +ICAgICAgICBEaW0gQXJyYXlTaXplIEFzIExvbmcNCiAgICAgICAgIEFycmF5U2l6 +ZSA9IFVCb3VuZChWYWx1ZSkNCiAgICAgICAgIElmIEVyci5OdW1iZXIgPD4gMCBU +aGVuDQogICAgICAgICAgICBFcnIuQ2xlYXINCiAgICAgICAgICAgIE51bGxGaWx0 +ZXJPckVtcHR5RmlsdGVyID0gVHJ1ZQ0KICAgICAgICAgICAgRXhpdCBGdW5jdGlv +bg0KICAgICAgICAgRW5kIElmDQogICAgICBFbmQgSWYNCiAgIEVsc2UNCiAgICAg +IE51bGxGaWx0ZXJPckVtcHR5RmlsdGVyID0gVmFsdWVzQXJlRXF1YWwoRmllbGRE +YXRhVHlwZSwgVmFsdWUsIElnbm9yZVZhbHVlKQ0KICAgRW5kIElmDQogICANCiAg +IElmIChSZWxhdGlvbmFsT3BlcmF0b3IgQW5kIFNRTF9Ob3QpID0gU1FMX05vdCBU +aGVuDQogICAgICAgICBOdWxsRmlsdGVyU3RyaW5nID0gUmVwbGFjZShOdWxsRmls +dGVyU3RyaW5nLCAiSXMgTnVsbCIsICJJcyBOb3QgTnVsbCIpDQogICBFbmQgSWYN +Cg0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gVmFsdWVzQXJlRXF1 +YWwoQnlWYWwgRmllbGREYXRhVHlwZSBBcyBTcWxGaWVsZERhdGFUeXBlLCBCeVZh +bCBWYWx1ZSBBcyBWYXJpYW50LCBCeVZhbCBWYWx1ZTIgQXMgVmFyaWFudCkgQXMg +Qm9vbGVhbg0KICAgDQogICBJZiBJc0FycmF5KFZhbHVlMikgVGhlbg0KICAgICAg +VmFsdWVzQXJlRXF1YWwgPSBBcnJheUNvbnRhaW5zKEZpZWxkRGF0YVR5cGUsIFZh +bHVlMiwgVmFsdWUpDQogICBFbHNlSWYgSXNOdWxsKFZhbHVlKSBUaGVuDQogICAg +ICBWYWx1ZXNBcmVFcXVhbCA9IElzTnVsbChWYWx1ZTIpDQogICBFbHNlSWYgSXNO +dWxsKFZhbHVlMikgVGhlbg0KICAgICAgVmFsdWVzQXJlRXF1YWwgPSBGYWxzZQ0K +ICAgRWxzZQ0KICAgICAgU2VsZWN0IENhc2UgRmllbGREYXRhVHlwZQ0KICAgICAg +ICAgQ2FzZSBTcWxGaWVsZERhdGFUeXBlLlNRTF9UZXh0DQogICAgICAgICAgICBW +YWx1ZXNBcmVFcXVhbCA9IChWQkEuU3RyQ29tcChWYWx1ZSwgVmFsdWUyLCB2YlRl +eHRDb21wYXJlKSA9IDApDQogICAgICAgICBDYXNlIFNxbEZpZWxkRGF0YVR5cGUu +U1FMX051bWVyaWMNCiAgICAgICAgICAgIFZhbHVlc0FyZUVxdWFsID0gKENEYmwo +VmFsdWUpID0gQ0RibChWYWx1ZTIpKQ0KICAgICAgICAgQ2FzZSBTcWxGaWVsZERh +dGFUeXBlLlNRTF9EYXRlDQogICAgICAgICAgICBWYWx1ZXNBcmVFcXVhbCA9IChD +RGF0ZShWYWx1ZSkgPSBDRGF0ZShWYWx1ZTIpKQ0KICAgICAgICAgQ2FzZSBTcWxG +aWVsZERhdGFUeXBlLlNRTF9Cb29sZWFuDQogICAgICAgICAgICBWYWx1ZXNBcmVF +cXVhbCA9IChDQm9vbChWYWx1ZSkgPSBDQm9vbChWYWx1ZTIpKQ0KICAgICAgICAg +Q2FzZSBFbHNlDQogICAgICAgICAgICBWYWx1ZXNBcmVFcXVhbCA9IChWYWx1ZSA9 +IFZhbHVlMikNCiAgICAgIEVuZCBTZWxlY3QNCiAgIEVuZCBJZg0KDQpFbmQgRnVu +Y3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBBcnJheUNvbnRhaW5zKEJ5VmFsIEZp +ZWxkRGF0YVR5cGUgQXMgU3FsRmllbGREYXRhVHlwZSwgQnlWYWwgQXJyYXlUb0No +ZWNrIEFzIFZhcmlhbnQsIEJ5VmFsIFNlYXJjaFZhbHVlIEFzIFZhcmlhbnQpIEFz +IEJvb2xlYW4NCiAgIA0KICAgRGltIGkgQXMgTG9uZw0KDQogICBJZiBJc051bGwo +U2VhcmNoVmFsdWUpIFRoZW4NCiAgICAgIEFycmF5Q29udGFpbnMgPSBBcnJheUNv +bnRhaW5zTnVsbChBcnJheVRvQ2hlY2spDQogICAgICBFeGl0IEZ1bmN0aW9uDQog +ICBFbmQgSWYNCg0KICAgRm9yIGkgPSBMQm91bmQoQXJyYXlUb0NoZWNrKSBUbyBV +Qm91bmQoQXJyYXlUb0NoZWNrKQ0KICAgICAgSWYgVmFsdWVzQXJlRXF1YWwoRmll +bGREYXRhVHlwZSwgQXJyYXlUb0NoZWNrKGkpLCBTZWFyY2hWYWx1ZSkgVGhlbg0K +ICAgICAgICAgQXJyYXlDb250YWlucyA9IFRydWUNCiAgICAgICAgIEV4aXQgRnVu +Y3Rpb24NCiAgICAgIEVuZCBJZg0KICAgTmV4dA0KDQogICBBcnJheUNvbnRhaW5z +ID0gRmFsc2UNCg0KRW5kIEZ1bmN0aW9uDQoNClByaXZhdGUgRnVuY3Rpb24gQXJy +YXlDb250YWluc051bGwoQnlWYWwgQXJyYXlUb0NoZWNrIEFzIFZhcmlhbnQpIEFz +IEJvb2xlYW4NCiAgIA0KICAgRGltIGkgQXMgTG9uZw0KDQogICBGb3IgaSA9IExC +b3VuZChBcnJheVRvQ2hlY2spIFRvIFVCb3VuZChBcnJheVRvQ2hlY2spDQogICAg +ICBJZiBJc051bGwoQXJyYXlUb0NoZWNrKGkpKSBUaGVuDQogICAgICAgICBBcnJh +eUNvbnRhaW5zTnVsbCA9IFRydWUNCiAgICAgICAgIEV4aXQgRnVuY3Rpb24NCiAg +ICAgIEVuZCBJZg0KICAgTmV4dA0KDQogICBBcnJheUNvbnRhaW5zTnVsbCA9IEZh +bHNlDQoNCkVuZCBGdW5jdGlvbg0KDQpQcml2YXRlIEZ1bmN0aW9uIEdldFZhbHVl +QXJyYXlTdHJpbmcoQnlWYWwgVmFsdWUgQXMgVmFyaWFudCwgQnlWYWwgRmllbGRE +YXRhVHlwZSBBcyBTcWxGaWVsZERhdGFUeXBlLCBfDQogICAgICAgICAgICAgICAg +ICAgICAgICAgICAgICAgICAgICAgQnlWYWwgRGVsaW1pdGVyIEFzIFN0cmluZywg +QnlWYWwgSWdub3JlVmFsdWUgQXMgVmFyaWFudCkgQXMgU3RyaW5nDQogICANCiAg +IERpbSBpIEFzIExvbmcNCiAgIERpbSBzIEFzIFN0cmluZw0KDQogICBGb3IgaSA9 +IExCb3VuZChWYWx1ZSkgVG8gVUJvdW5kKFZhbHVlKQ0KICAgICAgSWYgSXNBcnJh +eShJZ25vcmVWYWx1ZSkgVGhlbg0KICAgICAgICAgSWYgQXJyYXlDb250YWlucyhG +aWVsZERhdGFUeXBlLCBJZ25vcmVWYWx1ZSwgVmFsdWUoaSkpIFRoZW4NCiAgICAg +ICAgIEVsc2UNCiAgICAgICAgICAgIHMgPSBzICYgRGVsaW1pdGVyICYgQ29udmVy +dFRvU3FsVGV4dChWYWx1ZShpKSwgRmllbGREYXRhVHlwZSkNCiAgICAgICAgIEVu +ZCBJZg0KICAgICAgRWxzZQ0KICAgICAgICAgSWYgVmFsdWUoaSkgPSBJZ25vcmVW +YWx1ZSBUaGVuDQogICAgICAgICBFbHNlSWYgSXNOdWxsKFZhbHVlKGkpKSBBbmQg +SXNOdWxsKElnbm9yZVZhbHVlKSBUaGVuDQogICAgICAgICBFbHNlDQogICAgICAg +ICAgICBzID0gcyAmIERlbGltaXRlciAmIENvbnZlcnRUb1NxbFRleHQoVmFsdWUo +aSksIEZpZWxkRGF0YVR5cGUpDQogICAgICAgICBFbmQgSWYNCiAgICAgIEVuZCBJ +Zg0KICAgTmV4dA0KICAgSWYgTGVuKHMpID4gMCBBbmQgTGVuKERlbGltaXRlcikg +PiAwIFRoZW4NCiAgICAgIHMgPSBNaWQocywgTGVuKERlbGltaXRlcikgKyAxKQ0K +ICAgRW5kIElmDQogICBHZXRWYWx1ZUFycmF5U3RyaW5nID0gcw0KDQpFbmQgRnVu +Y3Rpb24NCg0KUHJpdmF0ZSBGdW5jdGlvbiBSZW1vdmVOdWxsRnJvbUluVmFsdWVT +dHJpbmcoQnlSZWYgVmFsdWVTdHJpbmcgQXMgU3RyaW5nKSBBcyBCb29sZWFuDQoN +CiAgIENvbnN0IE51bGxDaGVja1N0cmluZyBBcyBTdHJpbmcgPSAiLE51bGwsIg0K +ICAgRGltIFRlc3RTdHJpbmcgQXMgU3RyaW5nDQogICANCiAgIFRlc3RTdHJpbmcg +PSAiLCIgJiBWYWx1ZVN0cmluZyAmICIsIg0KDQogICBJZiBOb3QgKEluU3RyKDEs +IFRlc3RTdHJpbmcsIE51bGxDaGVja1N0cmluZykgPiAwKSBUaGVuDQogICAgICBS +ZW1vdmVOdWxsRnJvbUluVmFsdWVTdHJpbmcgPSBGYWxzZQ0KICAgICAgRXhpdCBG +dW5jdGlvbg0KICAgRW5kIElmDQogICANCiAgIFRlc3RTdHJpbmcgPSBSZXBsYWNl +KFRlc3RTdHJpbmcsIE51bGxDaGVja1N0cmluZywgIiwiKQ0KICAgDQogICBJZiBM +ZW4oVGVzdFN0cmluZykgPiAxIFRoZW4NCiAgICAgIFZhbHVlU3RyaW5nID0gTWlk +KFRlc3RTdHJpbmcsIDIsIExlbihUZXN0U3RyaW5nKSAtIDIpDQogICBFbHNlDQog +ICAgICBWYWx1ZVN0cmluZyA9IHZiTnVsbFN0cmluZw0KICAgRW5kIElmDQogICAN +CiAgIFJlbW92ZU51bGxGcm9tSW5WYWx1ZVN0cmluZyA9IFRydWUNCg0KRW5kIEZ1 +bmN0aW9uDQo= + + 20231011081056 + data/SqlTools.cls + + + defDbConnection + QXR0cmlidXRlIFZCX05hbWUgPSAiZGVmRGJDb25uZWN0aW9uIg0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQYWNrYWdlOiBkYXRh +LmRlZkRiQ29ubmVjdGlvbg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJw0KJyBTZXQgb2YgZ2xvYmFsIHR5cGVzLCBlbnVtcyBldGMu +IGZvciB0aGUgRGJDb25uZWN0aW9uIGNsYXNzZXMNCicNCictLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJzxjb2RlbGliPg0KJyAgPGZpbGU+ZGF0 +YS9kZWZEYkNvbm5lY3Rpb24uYmFzPC9maWxlPg0KJyAgPGxpY2Vuc2U+X2NvZGVs +aWIvbGljZW5zZS5iYXM8L2xpY2Vuc2U+DQonPC9jb2RlbGliPg0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KT3B0aW9uIENvbXBh +cmUgRGF0YWJhc2UNCk9wdGlvbiBFeHBsaWNpdA0KDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEdyb3VwOiBUeXBlcw0KJw0KDQon +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIFR5cGU6 +IERibXNDb25uZWN0aW9uU3RyaW5ncw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBUeXBlIGZvciB0aGUgc2ltdWx0YW5lb3Vz +IHRyYW5zZmVyIG9mIHRoZSBjb25uZWN0aW9uIHN0cmluZ3MNCicNCicgICAgIE9s +ZWRiQ29ubmVjdGlvblN0cmluZyAgIC0gT0xFREIgY29ubmVjdGlvbnN0cmluZyBm +b3IgQURPREIgY29ubmVjdGlvbg0KJyAgICAgT2RiY0Nvbm5lY3Rpb25TdHJpbmcg +ICAgLSBPREJDIGNvbm5lY3Rpb25zdHJpbmcgZm9yIERBTyBjb25uZWN0aW9uDQon +ICAgICBEYXRhYmFzZUZpbGUgICAgICAgICAgICAtIERhdGFiYXNlIGZpbGUgbmFt +ZSBpbmNsLiBwYXRoIGlmIGEgZmlsZSBiYWNrZW5kIGlzIHVzZWQNCicNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBUeXBl +IERibXNDb25uZWN0aW9uU3RyaW5ncw0KICAgT2xlZGJDb25uZWN0aW9uU3RyaW5n +IEFzIFN0cmluZw0KICAgT2RiY0Nvbm5lY3Rpb25TdHJpbmcgQXMgU3RyaW5nDQog +ICBEYXRhYmFzZUZpbGUgQXMgU3RyaW5nDQpFbmQgVHlwZQ0KDQoNCictLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgR3JvdXA6IEVudW1z +DQonDQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0N +CicgRW51bTogRGJtc0Nvbm5lY3Rpb25Nb2Rlcw0KJy0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyAgICAgRE1CU19EU05sZXNzICAg +LSAoMSkgICAgd2l0aG91dCBEU04NCicgICAgIERNQlNfRFNOICAgICAgIC0gKDIp +ICAgIHdpdGggRFNODQonICAgICBEQk1TX1VTRVJERUYgICAtICgxMjgpICBVc2Vy +LWRlZmluZWQgY29ubmVjdGlvbiBzdHJpbmdzDQonDQonLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQdWJsaWMgRW51bSBEYm1zQ29ubmVj +dGlvbk1vZGVzDQogICBETUJTX0RTTmxlc3MgPSAxICAgJ29obmUgRFNODQogICBE +TUJTX0RTTiA9IDIgICAgICAgJ21pdCBEU04NCiAgIERCTVNfVVNFUkRFRiA9IDEy +OCAnYmVudXR6ZXJkZWZpbmllcnRlIENvbm5lY3Rpb25zdHJpbmdzDQpFbmQgRW51 +bQ0K + + 20231011081056 + data/defDbConnection.bas + + + modDbConnection + QXR0cmlidXRlIFZCX05hbWUgPSAibW9kRGJDb25uZWN0aW9uIg0KJy0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQYWNrYWdlOiBkYXRh +Lm1vZERiQ29ubmVjdGlvbg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLQ0KJw0KJyBDb2xsZWN0aW9uIG9mIHByb2NlZHVyZXMgZm9yIHRo +ZSBEYkNvbm5lY3Rpb25NYW5hZ2VyIGNsYXNzDQonDQonIEF1dGhvcjoNCicgICAg +IEpvc2VmIFBvZXR6bA0KJw0KJyBSZW1hcmtzOg0KJyAgICAgVXNlZCB0byBpbnN0 +YW50aWF0ZSBEYkNvbm5lY3Rpb25NYW5hZ2VyIGFuZCBhY2Nlc3MgdGhlIG1haW4g +ZWxlbWVudHMgb2YgRGJDb25uZWN0aW9uTWFuYWdlci4NCicNCictLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJzxjb2RlbGliPg0KJyAgPGZpbGU+ +ZGF0YS9tb2REYkNvbm5lY3Rpb24uYmFzPC9maWxlPg0KJyAgPGxpY2Vuc2U+X2Nv +ZGVsaWIvbGljZW5zZS5iYXM8L2xpY2Vuc2U+DQonICA8dXNlPmRhdGEvRGJDb25u +ZWN0aW9uTWFuYWdlci5jbHM8L3VzZT4NCic8L2NvZGVsaWI+DQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonDQpPcHRpb24gQ29tcGFy +ZSBUZXh0DQpPcHRpb24gRXhwbGljaXQNCk9wdGlvbiBQcml2YXRlIE1vZHVsZQ0K +DQpQcml2YXRlIG1fRGJDb25uZWN0aW9uTWFuYWdlciBBcyBEYkNvbm5lY3Rpb25N +YW5hZ2VyICcgSGF1cHRzdGV1ZXJ1bmcNCg0KJyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIw0KJyBHcm91cDogRmFjdG9yaWVzDQoNCictLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicgUHJvcGVydHk6 +IERiQ29uDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +DQonDQonIEFjY2VzcyB0byBEYkNvbm5lY3Rpb24gb2YgdGhlIG1haW4gRGJDb25u +ZWN0aW9uTWFuYWdlciBpbnN0YW5jZQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgRGJD +b25uZWN0aW9uSGFuZGxlcg0KJw0KJyBSZW1hcmtzOg0KJyAgICAgU2ltcGxpZmll +cyB0aGUgY2FsbCwgYXMgdGhlIHdyaXRpbmcgb2YgdGhlIERiQ29ubmVjdGlvbk1h +bmFnZXIgaW5zdGFuY2UgdmFyaWFibGVzIGlzIG9taXR0ZWQuDQonICAgICBUaGUg +Zmlyc3QgYWNjZXNzIGNyZWF0ZXMgdGhlIGluc3RhbmNlIG9mIHRoZSBEYkNvbm5l +Y3Rpb25NYW5hZ2VyIGNsYXNzIGlmIGl0IGRvZXMgbm90IGFscmVhZHkgZXhpc3Qu +DQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQpQ +dWJsaWMgUHJvcGVydHkgR2V0IERiQ29uKCkgQXMgRGJDb25uZWN0aW9uSGFuZGxl +cg0KDQogICBJZiBtX0RiQ29ubmVjdGlvbk1hbmFnZXIgSXMgTm90aGluZyBUaGVu +DQogICAgICBTZXQgbV9EYkNvbm5lY3Rpb25NYW5hZ2VyID0gTmV3IERiQ29ubmVj +dGlvbk1hbmFnZXINCiAgIEVuZCBJZg0KICAgU2V0IERiQ29uID0gbV9EYkNvbm5l +Y3Rpb25NYW5hZ2VyLkRiQ29ubmVjdGlvbg0KDQpFbmQgUHJvcGVydHkNCg0KJy0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJyBQcm9wZXJ0 +eTogQ3VycmVudENvbm5lY3Rpb25JbmZvDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonDQonIEFjY2VzcyB0byBEYkNvbm5lY3Rpb25J +bmZvIG9mIHRoZSBtYWluIERiQ29ubmVjdGlvbk1hbmFnZXIgaW5zdGFuY2UNCicN +CicgUmV0dXJuczoNCicgICAgIDxkYXRhLkRiQ29ubmVjdGlvbkluZm8+DQonDQon +IFJlbWFya3M6DQonICAgICBTaW1wbGlmaWVzIHRoZSBjYWxsLCBhcyB0aGUgd3Jp +dGluZyBvZiB0aGUgRGJDb25uZWN0aW9uTWFuYWdlciBpbnN0YW5jZSB2YXJpYWJs +ZXMgaXMgb21pdHRlZC4NCicgICAgIFRoZSBmaXJzdCBhY2Nlc3MgY3JlYXRlcyB0 +aGUgaW5zdGFuY2Ugb2YgdGhlIERiQ29ubmVjdGlvbk1hbmFnZXIgY2xhc3MgaWYg +aXQgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4NCicNCictLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NClB1YmxpYyBQcm9wZXJ0eSBHZXQgQ3Vy +cmVudENvbm5lY3Rpb25JbmZvKCkgQXMgRGJDb25uZWN0aW9uSW5mbw0KDQogICBJ +ZiBtX0RiQ29ubmVjdGlvbk1hbmFnZXIgSXMgTm90aGluZyBUaGVuDQogICAgICBT +ZXQgbV9EYkNvbm5lY3Rpb25NYW5hZ2VyID0gTmV3IERiQ29ubmVjdGlvbk1hbmFn +ZXINCiAgIEVuZCBJZg0KICAgU2V0IEN1cnJlbnRDb25uZWN0aW9uSW5mbyA9IG1f +RGJDb25uZWN0aW9uTWFuYWdlci5Db25uZWN0aW9uSW5mbw0KDQpFbmQgUHJvcGVy +dHkNCg0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0K +JyBQcm9wZXJ0eTogRGJDb25uZWN0aW9uTWFuYWdlcg0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBBY2Nlc3MgdG8gRGJDb25u +ZWN0aW9uTWFuYWdlciBpbnN0YW5jZQ0KJw0KJyBSZXR1cm5zOg0KJyAgICAgRGJD +b25uZWN0aW9uTWFuYWdlcg0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLQ0KUHVibGljIFByb3BlcnR5IEdldCBEYkNvbm5lY3Rpb25N +YW5hZ2VyKCkgQXMgRGJDb25uZWN0aW9uTWFuYWdlcg0KDQogICBJZiBtX0RiQ29u +bmVjdGlvbk1hbmFnZXIgSXMgTm90aGluZyBUaGVuDQogICAgICBTZXQgbV9EYkNv +bm5lY3Rpb25NYW5hZ2VyID0gTmV3IERiQ29ubmVjdGlvbk1hbmFnZXINCiAgIEVu +ZCBJZg0KICAgU2V0IERiQ29ubmVjdGlvbk1hbmFnZXIgPSBtX0RiQ29ubmVjdGlv +bk1hbmFnZXINCg0KRW5kIFByb3BlcnR5DQoNCicjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIyMjIyMjIyMjIyMNCicgR3JvdXA6IEdsb2JhbCBQcm9jZWR1cmVz +DQoNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCicg +RnVuY3Rpb246IENoZWNrQ29ubmVjdGlvblN0YXR1cw0KJy0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBWZXJiaW5kdW5nIHBy/GZl +biAoY2FsbCA8ZGF0YS5EYkNvbm5lY3Rpb25NYW5hZ2VyLkNoZWNrQ29ubmVjdGlv +blN0YXR1cz4pDQonDQonIFJldHVybjoNCicgICAgIEJvb2xlYW4gLSBUcnVlIGlm +IHN1Y2Nlc3MNCicNCictLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0NClB1YmxpYyBGdW5jdGlvbiBDaGVja0Nvbm5lY3Rpb25TdGF0dXMoKSBB +cyBCb29sZWFuDQoNCiAgIElmIG1fRGJDb25uZWN0aW9uTWFuYWdlciBJcyBOb3Ro +aW5nIFRoZW4NCiAgICAgIFNldCBtX0RiQ29ubmVjdGlvbk1hbmFnZXIgPSBOZXcg +RGJDb25uZWN0aW9uTWFuYWdlcg0KICAgRW5kIElmDQogICBDaGVja0Nvbm5lY3Rp +b25TdGF0dXMgPSBtX0RiQ29ubmVjdGlvbk1hbmFnZXIuQ2hlY2tDb25uZWN0aW9u +U3RhdHVzDQoNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tDQonIFN1YjogRGlzcG9zZURiQ29ubmVjdGlvbg0K +Jy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KJw0KJyBE +aXNwb3NlIERiQ29ubmVjdGlvbiBvYmplY3RzIChpbmNsLiBEYkNvbm5lY3Rpb25N +YW5hZ2VyKQ0KJw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KUHVibGljIFN1YiBEaXNwb3NlRGJDb25uZWN0aW9uKCkNCg0KT24gRXJy +b3IgUmVzdW1lIE5leHQNCg0KICAgSWYgTm90IChtX0RiQ29ubmVjdGlvbk1hbmFn +ZXIgSXMgTm90aGluZykgVGhlbg0KICAgICAgbV9EYkNvbm5lY3Rpb25NYW5hZ2Vy +LkRpc3Bvc2UNCiAgIEVuZCBJZg0KICAgU2V0IG1fRGJDb25uZWN0aW9uTWFuYWdl +ciA9IE5vdGhpbmcNCiAgIA0KRW5kIFN1Yg0KDQonIyMjIyMjIyMjIyMjIyMjIyMj +IyMjIyMjIyMjIw0KJw0KJyBTdXBwb3J0IGZ1bmN0aW9ucw0KDQonLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBUYWJs +ZURlZkV4aXN0cw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLQ0KJw0KJyBDaGVjayBpZiBUYWJsZURlZiBleGlzdHMNCicNCicgUGFyYW1l +dGVyczoNCicgICAgIFRhYmxlRGVmTmFtZSAgIC0gKFN0cmluZykgVGFibGVEZWYg +bmFtZQ0KJyAgICAgZGIgICAgICAgICAgICAgLSAoREFPLkRhdGFiYXNlKSBEYXRh +YmFzZSB0byB1c2UgKG9wdGlvbmFsOiBpZiBub3RoaW5nIEN1cnJlbnREYiB3aWxs +IGJlIHVzZWQpDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gVGFibGVEZWZFeGlzdHMoQnlWYWwgVGFi +bGVEZWZOYW1lIEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgICAgIE9w +dGlvbmFsIEJ5VmFsIGRiIEFzIERBTy5EYXRhYmFzZSA9IE5vdGhpbmcpIEFzIEJv +b2xlYW4NCidTY2huZWxsZXIgd+RyZSBkZXIgWnVncmlmZiBhdWYgTVN5c09iamVj +dCAoc2VsZWN0IC4uIGZyb20gTVN5c09iamVjdCB3aGVyZSBOYW1lID0gJ1RhYmVs +bGVubmFtZScgQU5EIFR5cGUgSU4gKDEsIDQsIDYpDQonRWluZSB3ZWl0ZXJlIEFs +dGVybmF0aXZlIHfkcmUgZGFzIEF1c3dlcnRlbiD8YmVyIGNubi5PcGVuU2NoZW1h +KGFkU2NoZW1hVGFibGVzLCAuLi4pIC4uLiBkYW5uIHdlcmRlbiBhbGxlcmRpbmdz +IGtlaW5lIHZlcmtu/HBmdGVuIFRhYmVsbGVuIGdlcHL8ZnQNCiAgIA0KICAgRGlt +IHRkZiBBcyBEQU8uVGFibGVEZWYNCg0KICAgSWYgZGIgSXMgTm90aGluZyBUaGVu +DQogICAgICBTZXQgZGIgPSBDdXJyZW50RGINCiAgIEVuZCBJZg0KICAgDQogICBk +Yi5UYWJsZURlZnMuUmVmcmVzaA0KICAgRm9yIEVhY2ggdGRmIEluIGRiLlRhYmxl +RGVmcw0KICAgICAgSWYgdGRmLk5hbWUgPSBUYWJsZURlZk5hbWUgVGhlbg0KICAg +ICAgICAgVGFibGVEZWZFeGlzdHMgPSBUcnVlDQogICAgICAgICBFeGl0IEZvcg0K +ICAgICAgRW5kIElmDQogICBOZXh0DQoNCkVuZCBGdW5jdGlvbg0KDQonLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQonIEZ1bmN0aW9uOiBR +dWVyeURlZkV4aXN0cw0KJy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLQ0KJw0KJyBDaGVjayBpZiBRdWVyeURlZiBleGlzdHMNCicNCicgUGFy +YW1ldGVyczoNCicgICAgIFF1ZXJ5RGVmTmFtZSAgIC0gKFN0cmluZykgUXVlcnlE +ZWYgbmFtZQ0KJyAgICAgZGIgICAgICAgICAgICAgLSAoREFPLkRhdGFiYXNlKSBE +YXRhYmFzZSB0byB1c2UgKG9wdGlvbmFsOiBpZiBub3RoaW5nIEN1cnJlbnREYiB3 +aWxsIGJlIHVzZWQpDQonDQonLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t +LS0tLS0tLS0tDQpQdWJsaWMgRnVuY3Rpb24gUXVlcnlEZWZFeGlzdHMoQnlWYWwg +UXVlcnlEZWZOYW1lIEFzIFN0cmluZywgXw0KICAgICAgICAgICAgICAgICAgICAg +IE9wdGlvbmFsIEJ5VmFsIGRiIEFzIERBTy5EYXRhYmFzZSA9IE5vdGhpbmcpIEFz +IEJvb2xlYW4NCiAgIA0KICAgRGltIHFkZiBBcyBEQU8uUXVlcnlEZWYNCg0KICAg +SWYgZGIgSXMgTm90aGluZyBUaGVuDQogICAgICBTZXQgZGIgPSBDdXJyZW50RGIN +CiAgIEVuZCBJZg0KICAgDQogICBkYi5RdWVyeURlZnMuUmVmcmVzaA0KICAgRm9y +IEVhY2ggcWRmIEluIGRiLlF1ZXJ5RGVmcw0KICAgICAgSWYgcWRmLk5hbWUgPSBR +dWVyeURlZk5hbWUgVGhlbg0KICAgICAgICAgUXVlcnlEZWZFeGlzdHMgPSBUcnVl +DQogICAgICAgICBFeGl0IEZvcg0KICAgICAgRW5kIElmDQogICBOZXh0DQoNCkVu +ZCBGdW5jdGlvbg0K + + 20231011081056 + data/modDbConnection.bas + + + diff --git a/source/tables/usys_DbmsConnection_X.xml b/source/tables/usys_DbmsConnection_X.xml new file mode 100644 index 0000000..d4dd1d7 --- /dev/null +++ b/source/tables/usys_DbmsConnection_X.xml @@ -0,0 +1,109 @@ + + + + MSJET + 1 + 4 + Microsoft.Jet.OLEDB.4.0 + 1 + 0 + 0 + 255 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + 0 + + + MSSQL + 1 + 1 + SQL Server + SQLOLEDB + 7 + 251 + 251 + 255 + 255 + 255 + 255 + 255 + 249 + 251 + 2 + 4 + 4 + 251 + 249 + + + MySQL + 1 + 2 + MySQL ODBC 5.1 Driver + 7 + 249 + 249 + 255 + 255 + 0 + 255 + 255 + 249 + 0 + 2 + 4 + 4 + 0 + 249 + + + ODBC + 1 + 255 + 7 + 251 + 251 + 255 + 255 + 255 + 255 + 255 + 249 + 0 + 3 + 4 + 4 + 0 + 249 + + + ORACLE + 1 + 3 + Microsoft ODBC for Oracle + OraOLEDB.Oracle + 7 + 251 + 251 + 255 + 255 + 255 + 255 + 255 + 249 + 251 + 2 + 4 + 4 + 251 + 249 + + diff --git a/source/tables/usys_DbmsConnection_X_Driver.xml b/source/tables/usys_DbmsConnection_X_Driver.xml new file mode 100644 index 0000000..bca4366 --- /dev/null +++ b/source/tables/usys_DbmsConnection_X_Driver.xml @@ -0,0 +1,87 @@ + + + + 1 + MSSQL + ODBC + SQL Server + + + 2 + MSSQL + OLEDB + SQLOLEDB + + + 3 + MySQL + ODBC + MySQL ODBC 5.1 Driver + + + 4 + ORACLE + ODBC + Microsoft ODBC for Oracle + + + 5 + ORACLE + OLEDB + OraOLEDB.Oracle + + + 6 + MySQL + ODBC + MySQL ODBC 3.51 Driver + + + 7 + MSSQL + ODBC + SQL Native Client + + + 8 + MSSQL + OLEDB + MSOLEDBSQL + + + 9 + MSSQL + ODBC + ODBC Driver 17 for SQL Server + + + 10 + MSSQL + OLEDB + SQLNCLI + + + 11 + MSJET + OLEDB + Microsoft.Jet.OLEDB.4.0 + + + 12 + MSJET + OLEDB + Microsoft.ACE.OLEDB.12.0 + + + 13 + MSSQL + ODBC + SQL Server Native Client 11.0 + + + 14 + MSSQL + OLEDB + SQLNCLI11 + + diff --git a/source/tbldefs/L10n_Dict.sql b/source/tbldefs/L10n_Dict.sql new file mode 100644 index 0000000..e9b8f9a --- /dev/null +++ b/source/tbldefs/L10n_Dict.sql @@ -0,0 +1,6 @@ +CREATE TABLE [L10n_Dict] ( + [LangCode] VARCHAR (2), + [KeyText] VARCHAR (255), + [LngText] VARCHAR (255), + CONSTRAINT [PK_L10n_Dict] PRIMARY KEY ([LangCode], [KeyText]) +) diff --git a/source/tbldefs/L10n_Dict.xml b/source/tbldefs/L10n_Dict.xml new file mode 100644 index 0000000..c8b24e5 --- /dev/null +++ b/source/tbldefs/L10n_Dict.xml @@ -0,0 +1,113 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/USysRegInfo.json b/source/tbldefs/USysRegInfo.json new file mode 100644 index 0000000..de6bc30 --- /dev/null +++ b/source/tbldefs/USysRegInfo.json @@ -0,0 +1,9 @@ +{ + "Info": { + "Class": "clsDbTableDef", + "Description": "USysRegInfo Metadata" + }, + "Items": { + "Hidden": true + } +} diff --git a/source/tbldefs/USysRegInfo.sql b/source/tbldefs/USysRegInfo.sql new file mode 100644 index 0000000..35e1b05 --- /dev/null +++ b/source/tbldefs/USysRegInfo.sql @@ -0,0 +1,6 @@ +CREATE TABLE [USysRegInfo] ( + [Subkey] VARCHAR (255), + [Type] LONG, + [ValName] VARCHAR (255), + [Value] VARCHAR (255) +) diff --git a/source/tbldefs/USysRegInfo.xml b/source/tbldefs/USysRegInfo.xml new file mode 100644 index 0000000..d405f10 --- /dev/null +++ b/source/tbldefs/USysRegInfo.xml @@ -0,0 +1,127 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/tab1DS.json b/source/tbldefs/tab1DS.json new file mode 100644 index 0000000..94829a8 --- /dev/null +++ b/source/tbldefs/tab1DS.json @@ -0,0 +1,15 @@ +{ + "Info": { + "Class": "clsDbTableDef", + "Description": "tab1DS Metadata" + }, + "Items": { + "Properties": { + "Description": { + "Type": 10, + "Value": "Tabelle mit einem DS (ist in Abfragen hilfeich)" + } + }, + "Hidden": true + } +} diff --git a/source/tbldefs/tab1DS.sql b/source/tbldefs/tab1DS.sql new file mode 100644 index 0000000..fc823ac --- /dev/null +++ b/source/tbldefs/tab1DS.sql @@ -0,0 +1,4 @@ +CREATE TABLE [tab1DS] ( + [id] BIT CONSTRAINT [PrimaryKey] PRIMARY KEY UNIQUE NOT NULL, + [ShowInfoForm] BIT +) diff --git a/source/tbldefs/tab1DS.xml b/source/tbldefs/tab1DS.xml new file mode 100644 index 0000000..528c283 --- /dev/null +++ b/source/tbldefs/tab1DS.xml @@ -0,0 +1,72 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/usys_AppFiles.json b/source/tbldefs/usys_AppFiles.json new file mode 100644 index 0000000..60641f1 --- /dev/null +++ b/source/tbldefs/usys_AppFiles.json @@ -0,0 +1,9 @@ +{ + "Info": { + "Class": "clsDbTableDef", + "Description": "usys_AppFiles Metadata" + }, + "Items": { + "Hidden": true + } +} diff --git a/source/tbldefs/usys_AppFiles.sql b/source/tbldefs/usys_AppFiles.sql new file mode 100644 index 0000000..3dbf372 --- /dev/null +++ b/source/tbldefs/usys_AppFiles.sql @@ -0,0 +1,7 @@ +CREATE TABLE [usys_AppFiles] ( + [id] VARCHAR (20) CONSTRAINT [PrimaryKey] PRIMARY KEY UNIQUE NOT NULL, + [version] VARCHAR (10), + [file] LONGBINARY, + [SccRev] VARCHAR (20), + [url] VARCHAR (255) +) diff --git a/source/tbldefs/usys_AppFiles.xml b/source/tbldefs/usys_AppFiles.xml new file mode 100644 index 0000000..28cb170 --- /dev/null +++ b/source/tbldefs/usys_AppFiles.xml @@ -0,0 +1,154 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/usys_DbmsConnection.sql b/source/tbldefs/usys_DbmsConnection.sql new file mode 100644 index 0000000..37d2e50 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection.sql @@ -0,0 +1,21 @@ +CREATE TABLE [usys_DbmsConnection] ( + [CID] VARCHAR (20) CONSTRAINT [PK_usys_DbmsConnection] PRIMARY KEY UNIQUE NOT NULL, + [ActiveConnection] BIT, + [DBMS] VARCHAR (20), + [dbmsConnectionMode] BYTE, + [dbmsOleDbProvider] VARCHAR (255), + [dbmsOdbcDriver] VARCHAR (255), + [dbmsServer] VARCHAR (255), + [dbmsPort] VARCHAR (20), + [dbmsDatabase] VARCHAR (255), + [dbmsUseTrustedConnection] BIT, + [dbmsUseLoginForm] BIT, + [dbmsUser] VARCHAR (255), + [dbmsPwd] VARCHAR (255), + [dbmsOptionsODBC] VARCHAR (255), + [dbmsOptionsOLEDB] VARCHAR (255), + [dbmsDSN] VARCHAR (255), + [dbmsConStrODBC] VARCHAR (255), + [dbmsConStrOLEDB] VARCHAR (255), + [Remarks] LONGTEXT +) diff --git a/source/tbldefs/usys_DbmsConnection.xml b/source/tbldefs/usys_DbmsConnection.xml new file mode 100644 index 0000000..03778a8 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection.xml @@ -0,0 +1,166 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/usys_DbmsConnection_CopyBase.json b/source/tbldefs/usys_DbmsConnection_CopyBase.json new file mode 100644 index 0000000..e9790c3 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_CopyBase.json @@ -0,0 +1,15 @@ +{ + "Info": { + "Class": "clsDbTableDef", + "Description": "usys_DbmsConnection_CopyBase Metadata" + }, + "Items": { + "Properties": { + "Description": { + "Type": 10, + "Value": "Verbindungseintellungen" + } + }, + "Hidden": true + } +} diff --git a/source/tbldefs/usys_DbmsConnection_CopyBase.sql b/source/tbldefs/usys_DbmsConnection_CopyBase.sql new file mode 100644 index 0000000..cf49569 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_CopyBase.sql @@ -0,0 +1,21 @@ +CREATE TABLE [usys_DbmsConnection_CopyBase] ( + [CID] VARCHAR (10) CONSTRAINT [PrimaryKey] PRIMARY KEY UNIQUE NOT NULL, + [activeConnection] BIT, + [DBMS] VARCHAR (15), + [dbmsConnectionMode] BYTE, + [dbmsOleDbProvider] VARCHAR (255), + [dbmsOdbcDriver] VARCHAR (255), + [dbmsServer] VARCHAR (255), + [dbmsPort] VARCHAR (20), + [dbmsDatabase] VARCHAR (255), + [dbmsUseTrustedConnection] BIT, + [dbmsUseLoginForm] BIT, + [dbmsUser] VARCHAR (255), + [dbmsPwd] VARCHAR (255), + [dbmsOptionsODBC] VARCHAR (255), + [dbmsOptionsOLEDB] VARCHAR (255), + [dbmsDSN] VARCHAR (255), + [dbmsConStrODBC] VARCHAR (255), + [dbmsConStrOLEDB] VARCHAR (255), + [Remarks] LONGTEXT +) diff --git a/source/tbldefs/usys_DbmsConnection_CopyBase.xml b/source/tbldefs/usys_DbmsConnection_CopyBase.xml new file mode 100644 index 0000000..f127285 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_CopyBase.xml @@ -0,0 +1,488 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/usys_DbmsConnection_X.json b/source/tbldefs/usys_DbmsConnection_X.json new file mode 100644 index 0000000..459081a --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_X.json @@ -0,0 +1,15 @@ +{ + "Info": { + "Class": "clsDbTableDef", + "Description": "usys_DbmsConnection_X Metadata" + }, + "Items": { + "Properties": { + "Description": { + "Type": 10, + "Value": "Einstellungen des Layouts zur Parametereingabe von je DBMS" + } + }, + "Hidden": true + } +} diff --git a/source/tbldefs/usys_DbmsConnection_X.sql b/source/tbldefs/usys_DbmsConnection_X.sql new file mode 100644 index 0000000..4303a0f --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_X.sql @@ -0,0 +1,24 @@ +CREATE TABLE [usys_DbmsConnection_X] ( + [DBMS] VARCHAR (15) CONSTRAINT [PrimaryKey] PRIMARY KEY UNIQUE NOT NULL, + [dbmsEnabled] BIT, + [seq] BYTE, + [DriverODBC] VARCHAR (255), + [DriverOLEDB] VARCHAR (255), + [DriverRemarks] VARCHAR (255), + [XdbmsConnectionModes] LONG, + [XdbmsServer] BYTE, + [XdbmsPort] BYTE, + [XdbmsDatabase] BYTE, + [XdbmsUseLoginForm] BYTE, + [XdbmsUseTrustedConnection] BYTE, + [XdbmsUser] BYTE, + [XdbmsPwd] BYTE, + [XdbmsOptionsODBC] BYTE, + [XdbmsOptionsOLEDB] BYTE, + [XdbmsDSN] BYTE, + [XdbmsConStrODBC] BYTE, + [XdbmsConStrOLEDB] BYTE, + [XdbmsOledbProvider] BYTE, + [XdbmsOdbcDriver] BYTE, + [XdbmsTableListSQL] LONGTEXT +) diff --git a/source/tbldefs/usys_DbmsConnection_X.xml b/source/tbldefs/usys_DbmsConnection_X.xml new file mode 100644 index 0000000..ae157ea --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_X.xml @@ -0,0 +1,454 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/tbldefs/usys_DbmsConnection_X_Driver.json b/source/tbldefs/usys_DbmsConnection_X_Driver.json new file mode 100644 index 0000000..72057b6 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_X_Driver.json @@ -0,0 +1,9 @@ +{ + "Info": { + "Class": "clsDbTableDef", + "Description": "usys_DbmsConnection_X_Driver Metadata" + }, + "Items": { + "Hidden": true + } +} diff --git a/source/tbldefs/usys_DbmsConnection_X_Driver.sql b/source/tbldefs/usys_DbmsConnection_X_Driver.sql new file mode 100644 index 0000000..ddeb9c5 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_X_Driver.sql @@ -0,0 +1,6 @@ +CREATE TABLE [usys_DbmsConnection_X_Driver] ( + [id] AUTOINCREMENT CONSTRAINT [PrimaryKey] PRIMARY KEY UNIQUE NOT NULL, + [DBMS] VARCHAR (255), + [ConMode] VARCHAR (255), + [Driver] VARCHAR (255) +) diff --git a/source/tbldefs/usys_DbmsConnection_X_Driver.xml b/source/tbldefs/usys_DbmsConnection_X_Driver.xml new file mode 100644 index 0000000..64bc443 --- /dev/null +++ b/source/tbldefs/usys_DbmsConnection_X_Driver.xml @@ -0,0 +1,146 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/source/themes/1_Office Theme.thmx b/source/themes/1_Office Theme.thmx new file mode 100644 index 0000000..53dd191 Binary files /dev/null and b/source/themes/1_Office Theme.thmx differ diff --git a/source/vbe-project.json b/source/vbe-project.json new file mode 100644 index 0000000..0aabc80 --- /dev/null +++ b/source/vbe-project.json @@ -0,0 +1,17 @@ +{ + "Info": { + "Class": "clsDbVbeProject", + "Description": "VBE Project" + }, + "Items": { + "Name": "DbmsConnectionWizard", + "Description": "", + "FileName": "DbmsConnectionWizard.accdb", + "HelpFile": "", + "HelpContextId": 0, + "ConditionalCompilationArguments": "USELOCALIZATION = 1 : CONFIG_USELOGINFORM = 1", + "Mode": 0, + "Protection": 0, + "Type": 100 + } +} diff --git a/source/vbe-references.json b/source/vbe-references.json new file mode 100644 index 0000000..5db299a --- /dev/null +++ b/source/vbe-references.json @@ -0,0 +1,20 @@ +{ + "Info": { + "Class": "clsDbVbeReference", + "Description": "VBE References" + }, + "Items": { + "ADODB": { + "GUID": "{00000201-0000-0010-8000-00AA006D2EA4}", + "Version": "2.1" + }, + "DAO": { + "GUID": "{4AC9E1DA-5BAD-4AC7-86E3-24F4CDCECA28}", + "Version": "12.0" + }, + "VBIDE": { + "GUID": "{0002E157-0000-0000-C000-000000000046}", + "Version": "5.3" + } + } +} diff --git a/source/vcs-agent-docs/forms-reports.md b/source/vcs-agent-docs/forms-reports.md new file mode 100644 index 0000000..a6f0b2d --- /dev/null +++ b/source/vcs-agent-docs/forms-reports.md @@ -0,0 +1,105 @@ +# Form and Report Layout Files + +Covers `.form` and `.report` files (legacy projects use `.bas`) and their companion +`.json`. For the `.cls` code-behind, see `vba-modules.md`. + +## The SaveAsText format + +These files use Access's `SaveAsText` format. It is not VBA, and it is largely +undocumented: + +``` +Version =21 <- Access version marker +VersionRequired =20 +Begin Form <- Form or Report + RecordSelectors = NotDefault + Caption ="My Form Title" + Begin + Begin Label <- A control + Left =1234 + Top =567 + Width =2000 + Height =300 + Name ="lblTitle" + Caption ="Welcome" + End + Begin CommandButton + Name ="cmdOK" + Caption ="OK" + OnClick ="[Event Procedure]" + End + End +End +CodeBehindForm <- VBA section, when layout is not split +Attribute VB_Name = "Form_frmMyForm" +``` + +## What is safe to change + +Property edits are safe wherever you can infer the expected format from +neighboring values: caption text inside quotes, geometry such as `Left`, `Top`, +`Width`, and `Height`, colors, and font sizes. On forms (export format 5.1.0+), +layout-group geometry is rewritten to a 60-twip grid, so a track edit rewrites +sibling cells; do not drop `Left`/`Top`/`Width`/`Height` or `EmptyCell` spacers. +`LayoutCached*` is omitted on export. Guessing at a property whose format you +cannot infer breaks the layout or fails the import, so leave those alone, along +with the `Version` lines at the top. Keep `Begin`/`End` balanced throughout. + +## Adding, removing, and renaming controls + +Structural edits work if you copy rather than compose. The property set Access +expects for a control type is not something to invent, so use an existing +control of the same type in the same file as your template. + +To add a control: + +1. Copy an entire `Begin ` ... `End` block, including any nested + `Begin`/`End` subtree. An attached label lives *inside* its text box, combo + box, or check box, and an option group's buttons live inside the group. +2. Paste it into the intended section's inner `Begin` block. Appending at the + end of the section is the safest placement. +3. Give the new control, and every nested control copied with it, a `Name` that + is unique within the file. +4. Set the geometry. Raise the form `Width` and section `Height` if the new + control extends past them. On a Layout-view form, keep `LayoutGroup`, + `GroupTable`, and `RowStart`/`ColumnEnd` consistent with the row you copied. +5. Set `TabIndex` to a value not already used in that section. `TabIndex`, not + file order, determines tab order. +6. If you kept an event property such as `OnClick ="[Event Procedure]"`, add the + handler to the `.cls` code-behind. Access binds handlers by control name, so + `Private Sub cmdSave_Click()` pairs with `Name ="cmdSave"`. + +To remove a control, delete its whole block including nested children, then +remove its event handlers and any references to it from the `.cls`. + +Renaming means updating every reference to the old name: handler procedure names +and code in the `.cls`, and any key for that control in the companion `.json`. + +## Conditional formatting + +With **Decode conditional formatting to JSON** enabled (export format 5.0.0 and +later), the opaque `ConditionalFormat` and `ConditionalFormat14` hex blocks are +stripped out of each control and stored as readable rules in the companion `.json`, +under `Items.ConditionalFormatting` keyed by control name. Edit the rules there +rather than the hex. + +With the option disabled, the binary blocks stay inline in the layout file. Either +way the add-in rebuilds them on import. + +On import the JSON wins. If a control has a JSON entry, any stale inline block for +that control is stripped before the rebuilt block is injected, which keeps repeated +imports idempotent. A control with an inline block but no JSON entry is left +untouched. + +The binary layout and the exact boundary of what survives a decode/rebuild cycle +are documented in +[docs/access-conditional-format.md](https://github.com/joyfullservice/msaccess-vcs-addin/blob/dev/docs/access-conditional-format.md). + +## Recovering from a bad edit + +If a form or report looks wrong after import, the usual causes are an unbalanced +`Begin`/`End` pair or a mangled property value. Restore the `.form` or `.report` +file from git and redo the change in smaller steps. + +To check a structural edit, ask for a re-export after the merge build. A +`git diff` on the file then shows what Access normalized or dropped. diff --git a/source/vcs-agent-docs/queries.md b/source/vcs-agent-docs/queries.md new file mode 100644 index 0000000..1bc6a5c --- /dev/null +++ b/source/vcs-agent-docs/queries.md @@ -0,0 +1,53 @@ +# Query Source Files + +Each query in `queries/` is exported as two files: a `.sql` holding the statement, +and a `.json` holding everything that SQL cannot express. + +## Editing query logic + +Edit the `.sql`. It is the sole source of truth for the query's SQL text, and +changing it is the normal way to change what a query does. + +```sql +SELECT + CustomerID, + CustomerName, + Email +FROM tblCustomers +WHERE Active = True +ORDER BY CustomerName; +``` + +On import the add-in reads both files, generates a temporary `.qdef` in memory, and +hands it to `LoadFromText`. When the SQL is designer-compatible and the `.json` +carries layout data, the query imports in Design View format with table positions +preserved; otherwise it imports as SQL View. Making the SQL incompatible with the +designer — adding a `UNION` or a subquery, for example — causes the layout data to +be ignored and logs a warning, which is expected rather than an error. + +## The companion `.json` + +| Key | Meaning | +|-----|---------| +| `QueryType` | 0 Select, 16 Crosstab, 32 Delete, 48 Update, 64 Append | +| `Connect` | Connection string for pass-through queries, usually an `env:` reference | +| `QueryProperties` | Non-default query properties from the `LvProp` binary blob | +| `Columns` | Column metadata, sorted alphabetically for deterministic output | +| `DesignLayout` | Table positions and window dimensions; present only for queries last saved in Design View | +| `Description` | Object description from DAO document properties | +| `Hidden` | True when the query is hidden in the Navigation Pane | + +Edit these values directly when you need to change a property the SQL cannot carry. +Keep the file valid JSON. + +Pass-through `Connect` values use `env:` references rather than raw ODBC strings; +see `troubleshooting.md` for how those resolve. + +## Legacy files + +Older projects may still contain `.qdef` or `.bas` query files. Import still +accepts them. On export format 4.1.2 the `.bas` file is the import source; a +paired `.sql` is applied only when **Force import of original SQL for queries** +is enabled. To make `.sql` the source of truth, switch to export format 5.0+ +and run a full export — that writes `.sql` plus `.json` and removes the legacy +files. diff --git a/source/vcs-agent-docs/testing.md b/source/vcs-agent-docs/testing.md new file mode 100644 index 0000000..201e79b --- /dev/null +++ b/source/vcs-agent-docs/testing.md @@ -0,0 +1,110 @@ +# Automated Testing + +The add-in includes a test runner that discovers and executes tests in whatever +database is open. Tests assert with `TestAssert`, a drop-in replacement for +`Debug.Assert`. Nothing in the project needs a compile-time reference to the add-in. + +## Setup + +Run `VCS.InstallTestAssertModule` from the Immediate Window to inject the +`modTestAssert` module. `VCS.MigrateDebugAssert` converts existing `Debug.Assert` +calls in bulk. + +## Writing tests + +A test is a parameterless `Public Sub` in a test module: + +```vba +Option Compare Database +Option Explicit +Option Private Module +'@Folder("Tests") + +Public Sub TestDoubleInput() + TestAssert MyFunction(42) = 84, "MyFunction should double input" + TestAssert MyFunction(0) = 0, "Zero input returns zero" +End Sub +``` + +The second `TestAssert` argument is optional context that identifies which +assertion failed, which matters inside loops and shared helpers. + +A module counts as a test module if it carries `'@Folder("...Tests...")` (in +projects using `@Folder` at all) or its name contains `Test`. Within it, only +parameterless `Public Sub` procedures are registered, and only if the module has a +`TestAssert` call. To exclude a helper, make it `Private` or give it a parameter. + +**Class modules** work the same way and add per-test setup and teardown: every test +method gets a fresh instance, so `Class_Initialize` runs before it and +`Class_Terminate` after. Use parameterless `Public Sub` or `Public Function`. Name +test modules `modTest*` or `clsTest*`, and mark standard ones +`Option Private Module`. + +## Prompts during a run + +A run is unattended: a `MsgBox`, `InputBox`, or modal form in code a test reaches +stalls it until someone clicks. `modTestAssert.TestRunActive` is true for the whole +run, so guard anything that waits for a person: + +```vba +If Not TestRunActive Then MsgBox "Import complete.", vbInformation +``` + +Prefer guarding a prompt whose absence changes nothing; where a prompt decides +something, branch to the answer an unattended run should get. A `modTestAssert` +installed before this feature will not have the flag. + +## Running tests + +Run `?VCS.RunTests` from the Immediate Window, or use **Tools > Run Tests** on the +ribbon. After a completed run the runner can re-run only the failures. + +`RunTests` takes an optional `ParamArray` of filters. Each argument resolves in +priority order: exact module name, then suite or `@Folder` value (matching the full +path or its final segment, so `"SQL"` matches `"Tests.SQL"`), then procedure name or +full `Module.Procedure` key, then tag. Prefix an argument with `-` to exclude it. +Inclusions combine with OR, exclusions with AND, and a list containing only +exclusions starts from all tests. + +```vba +?VCS.RunTests("-slow") ' Everything except slow-tagged tests +?VCS.RunTests("Reporting", "-slow") ' The Reporting suite, skipping slow tests +?VCS.RunTests("TestInvoiceTotal") ' One specific procedure +``` + +`RunTests` returns a JSON summary with per-test status, assertion detail, and tags. + +## Tagging + +`'@Tag("name")` annotations categorize tests and are case-insensitive. A +module-level tag sits in the first ~30 lines, before any procedure, and applies to +every test in the module. A procedure-level tag sits at the very top of the +procedure body, before any executable line including `Dim`. The two sets merge. + +## Global suite hooks + +`modTestAssert` may define two optional once-per-run hooks: + +```vba +Public Sub GlobalTestSetup() ' Before the first test, when at least one is selected +Public Sub GlobalTestTeardown() ' After all tests; the results JSON already exists +``` + +`VCS.InstallTestAssertModule` writes empty stubs with inline guidance; if absent +the runner skips them silently. They do not run when no tests are discovered or a +filter matches nothing. An error inside a hook is non-fatal — it goes to the +console, the run continues, and teardown still executes. Per-test +`Class_Initialize` and `Class_Terminate` nest inside these hooks unchanged. + +## Where results land + +| File | Contents | +|------|----------| +| `logs/TestResults_.json` | Per-run results with per-assertion detail | +| `logs/TestRun_.log` | Full console output including timing | +| `test-results/test-state.json` | Merged current state; a partial run updates only the tests it executed and flags the rest `stale` | +| `test-results/test-results.xml` | JUnit XML projection of the state file | +| `test-results/test-results.html` | Self-contained HTML dashboard | + +Both folders are gitignored, so search tools will not find them. See +`troubleshooting.md` for how to list and read them. diff --git a/source/vcs-agent-docs/troubleshooting.md b/source/vcs-agent-docs/troubleshooting.md new file mode 100644 index 0000000..b4103c2 --- /dev/null +++ b/source/vcs-agent-docs/troubleshooting.md @@ -0,0 +1,94 @@ +# Troubleshooting and Logs + +## Reading the logs + +Every operation writes a timestamped log to the `logs/` subfolder. Check the most +recent one first; it carries the detailed output, timing, and error messages. + +| Pattern | Operation | +|---------|-----------| +| `Export_.log` | Export | +| `Build_.log` | Full build | +| `Merge_.log` | Merge build **and** single-object import | +| `TestRun_.log` | Test run console output | + +A single-object import that seems to have produced no log wrote a `Merge_*.log`. + +**`logs/` and `test-results/` are gitignored**, so tools that respect `.gitignore` +— glob, grep, and semantic search — will silently skip them. Use the shell: + +```powershell +Get-ChildItem -Path "logs" | Sort-Object LastWriteTime -Descending | Select-Object -First 3 +Get-ChildItem -Path "test-results" +``` + +## Import fails with no clear error + +Almost always the encoding changed. Confirm the file still begins with the bytes +`EF BB BF` and re-save it as UTF-8 with BOM. + +## Import fails or objects are corrupted after an edit + +Check the line endings. The file needs CRLF (`0D 0A`), not bare LF. Restore it from +git or re-save with CRLF. + +## Unresolved Git conflict markers + +After a `git merge`, `git stash pop`, or branch switch, a source file may still +contain lines starting with `<<<<<<<` or `>>>>>>>`. The add-in skips that file and +logs: + +`Unresolved Git conflict markers in '' (line N). Resolve the conflict in this +file, then merge again.` + +Open the named file, resolve every conflict section, remove the marker lines, save, +and run merge again. + +## "Object not found" after import + +The `Attribute VB_Name` inside the file no longer matches the filename, usually +because the file was renamed without updating the name stored in it. Make them +agree, without the extension. + +## VBA compile error after import + +Typical causes are a syntax error introduced by an edit, a missing declaration, or +a reference to something that does not exist. + +The compile tools available over MCP report only success or failure — never the +failing module or line. When `vcs_compile_vba` returns `success: false`, or +`vcs_check_vba_compiled` returns `compiled: false`: + +1. Stop. Do not edit more source files or guess at a fix. +2. Ask the user to open the database in Access, open the VBA editor, and choose + **Debug > Compile**. Access jumps to the first error. +3. Ask them to paste the few lines around it. The snippet is usually enough; the + error text is optional. +4. Propose a targeted fix, then re-import and re-compile. + +Working in Access directly, the highlighted line after **Debug > Compile** tells +you the same thing. + +## XML parse error + +Invalid syntax such as an unclosed tag, or an unescaped special character. Validate +the structure and check how special characters are encoded. + +## Build prompts for SQL authentication + +Linked tables and pass-through queries store `env:conn_*` references rather than raw +ODBC strings, in `tbldefs/*.json`, the `Connect` value in `queries/*.json`, and +`db-connection.json`. At build time the add-in resolves each reference against the +`.env` file at this folder's root, which is per-developer and gitignored. + +A prompt means the key is missing from the resolved configuration or the server is +unreachable. Search the build log for `Connection key not found in .env file:`. + +`db-connection.json` only **primes** Access's ODBC cache during import, running one +temporary query per connection so later linked-table imports reuse the cached +credentials. It stores `env:` keys, not connection strings, so do not treat it as a +registry of connections. + +Per-environment layering through an `APP_ENV` selector is supported and documented +in the +[Connections wiki page](https://github.com/joyfullservice/msaccess-vcs-addin/wiki/Connections). diff --git a/source/vcs-agent-docs/vba-modules.md b/source/vcs-agent-docs/vba-modules.md new file mode 100644 index 0000000..3da8b3d --- /dev/null +++ b/source/vcs-agent-docs/vba-modules.md @@ -0,0 +1,101 @@ +# VBA Module Source Files + +Covers `.bas` and `.cls` files in `modules/`, and the `.cls` code-behind files in +`forms/` and `reports/`. + +## Standard modules (`.bas`) + +``` +Attribute VB_Name = "ModuleName" <- Required: must match the filename +'--------------------------------------------------------------------------------------- +' Module : ModuleName <- Optional comment header +' Purpose : Description here +'--------------------------------------------------------------------------------------- +Option Compare Database <- Optional +Option Explicit <- Optional + +Public Sub MySub() + ' Code starts after any Option statements +End Sub +``` + +Add and edit procedures, functions, and declarations freely. Leave the +`Attribute VB_Name` line alone; it must equal the filename without its extension. + +`Option` statements are not required. Some projects omit them entirely, so match +whatever the surrounding modules do rather than adding them. + +## Class modules (`.cls`) + +``` +VERSION 1.0 CLASS <- Required header block +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "ClassName" <- Required: must match the filename +Attribute VB_GlobalNameSpace = False <- Required (legacy, but must be present) +Attribute VB_Creatable = False +Attribute VB_PredeclaredId = False <- True gives the class a default instance +Attribute VB_Exposed = False <- True exposes it to other projects +Option Compare Database <- Optional +Option Explicit <- Optional + +Private m_Value As String + +Public Property Get Value() As String +Attribute Value.VB_Description = "Returns the value" <- Member attribute + Value = m_Value +End Property +``` + +Edit the code and comment headers. Leave the `VERSION` block and the module-level +`Attribute VB_*` lines exactly as they are. + +## Member attributes + +Attributes can also appear **inside** procedures and properties, carrying metadata +that the VBA editor hides but the Object Browser displays. They go on the line +immediately after the `Sub`, `Function`, or `Property` declaration: + +```vba +Public Function GetItem(Index As Long) As Variant +Attribute GetItem.VB_Description = "Returns item at specified index" +Attribute GetItem.VB_UserMemId = 0 + GetItem = m_Items(Index) +End Function +``` + +| Attribute | Effect | +|-----------|--------| +| `Attribute [Member].VB_Description = "text"` | Description shown in the Object Browser | +| `Attribute [Member].VB_UserMemId = 0` | Makes this the class's default member | +| `Attribute [Member].VB_UserMemId = -4` | Returns an enumerator, enabling `For Each` | + +Reword the description text if it is wrong. Do not change the attribute syntax or +the member name it refers to; the name must match the procedure it sits under. + +## Form and report code-behind + +When the **Split Layout from VBA** option is on, a form's or report's code lives in +its own `.cls` beside the layout file: + +``` +VERSION 1.0 CLASS +BEGIN + MultiUse = -1 'True +END +Attribute VB_Name = "Form_frmMyForm" <- Must be "Form_" (or "Report_") + object name +Attribute VB_GlobalNameSpace = False +Attribute VB_Creatable = True +Attribute VB_PredeclaredId = True +Attribute VB_Exposed = False +Option Compare Database + +Private Sub Form_Load() + ' Event handler code +End Sub +``` + +Edit event handlers and procedures here as you would in any class module. When the +option is off, the code is instead inside the `.form` or `.report` file under a +`CodeBehindForm` line. diff --git a/source/vcs-index.idx b/source/vcs-index.idx new file mode 100644 index 0000000..3394ebd Binary files /dev/null and b/source/vcs-index.idx differ diff --git a/source/vcs-options.json b/source/vcs-options.json new file mode 100644 index 0000000..6d71efc --- /dev/null +++ b/source/vcs-options.json @@ -0,0 +1,102 @@ +{ + "Info": { + "AddinVersion": "5.1.0", + "AccessVersion": "16.0 64-bit" + }, + "Options": { + "ExportFolder": "\\source", + "UseFastSave": true, + "SplitLayoutFromVBA": true, + "ExportFormatVersion": "5.1.0", + "RunBeforeExport": "", + "RunAfterExport": "", + "SanitizeLevel": 2, + "SanitizeColors": 1, + "SaveQuerySQL": true, + "FormatSQL": true, + "UseDeterministicQueryExport": true, + "SaveTableSQL": true, + "SavePrintVars": true, + "DecodeConditionalFormatting": true, + "ExtractThemeFiles": false, + "UseEnvForConnections": 0, + "ExportPrintSettings": { + "Orientation": true, + "PaperSize": true, + "Duplex": false, + "PrintQuality": false, + "DisplayFrequency": false, + "Collate": false, + "Resolution": false, + "DisplayFlags": false, + "Color": false, + "Copies": false, + "ICMMethod": false, + "DefaultSource": false, + "Scale": false, + "ICMIntent": false, + "FormName": false, + "PaperLength": false, + "DitherType": false, + "MediaType": false, + "PaperWidth": false, + "TTOption": false + }, + "ExportLayoutSvg": false, + "LayoutSvgImageEmbed": "Small", + "LayoutSvgScaleMode": "Universal", + "ExportAfterMerge": false, + "ForceImportOriginalQuerySQL": false, + "UseMergeBuild": false, + "MergeTableData": true, + "SkipReopenBeforeMerge": false, + "RunBeforeBuild": "", + "RunAfterBuild": "", + "RunBeforeMerge": "", + "RunAfterMerge": "", + "ValidateAfterBuild": "", + "TablesToExportData": { + "L10n_Dict": { + "Format": "XML Format" + }, + "usys_AppFiles": { + "Format": "XML Format" + }, + "usys_DbmsConnection_X": { + "Format": "XML Format" + }, + "usys_DbmsConnection_X_Driver": { + "Format": "XML Format" + }, + "USysRegInfo": { + "Format": "Tab Delimited" + }, + "USysRibbons": { + "Format": "Tab Delimited" + } + }, + "SchemaExports": { + }, + "McpAllowImport": true, + "McpAllowCallVBA": true, + "McpAllowExecuteSQL": true, + "McpAllowRunVBA": false, + "DefaultTestFilter": "", + "ShowDebug": false, + "BreakOnError": false, + "MaxLogFiles": 20, + "StripPublishOption": true, + "PreserveRubberDuckID": false, + "SaveAllDocumentProperties": false, + "SaveLinkedTableDef": false, + "HashAlgorithm": "SHA256", + "UseShortHash": true, + "UseGitIntegration": false, + "ShowVCSLegacy": true, + "UseWebTestRunner": true, + "ExportTestResultsJUnit": true, + "ExportTestResultsHtml": true, + "ExportPerfJson": false, + "McpProgressIntervalMs": 500 + } +}