├── TODO.md
├── PECmd
├── PcDesktopConfigure.ico
├── FodyWeavers.xml
├── Properties
│ └── AssemblyInfo.cs
├── PECmd.csproj
├── FodyWeavers.xsd
├── Program.cs
└── ExternalFiles.cs
├── .idea
└── .idea.PECmd
│ └── .idea
│ ├── encodings.xml
│ ├── vcs.xml
│ ├── indexLayout.xml
│ └── .gitignore
├── LICENSE
├── PECmd.sln
├── .gitattributes
├── README.md
├── .gitignore
└── PECmd.saproj
/TODO.md:
--------------------------------------------------------------------------------
1 | - detect OS and warn if less than Windows 8 Re: Windows 10 files
2 |
--------------------------------------------------------------------------------
/PECmd/PcDesktopConfigure.ico:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/EricZimmerman/PECmd/HEAD/PECmd/PcDesktopConfigure.ico
--------------------------------------------------------------------------------
/PECmd/FodyWeavers.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/.idea.PECmd/.idea/encodings.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
--------------------------------------------------------------------------------
/.idea/.idea.PECmd/.idea/vcs.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
--------------------------------------------------------------------------------
/.idea/.idea.PECmd/.idea/indexLayout.xml:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/.idea/.idea.PECmd/.idea/.gitignore:
--------------------------------------------------------------------------------
1 | # Default ignored files
2 | /shelf/
3 | /workspace.xml
4 | # Rider ignored files
5 | /projectSettingsUpdater.xml
6 | /.idea.PECmd.iml
7 | /modules.xml
8 | /contentModel.xml
9 | # Editor-based HTTP Client requests
10 | /httpRequests/
11 | # Datasource local storage ignored files
12 | /dataSources/
13 | /dataSources.local.xml
14 |
--------------------------------------------------------------------------------
/PECmd/Properties/AssemblyInfo.cs:
--------------------------------------------------------------------------------
1 | using System.Reflection;
2 | using System.Runtime.InteropServices;
3 |
4 | [assembly: AssemblyTrademark("saericzimmerman@gmail.com")]
5 |
6 | // Setting ComVisible to false makes the types in this assembly not visible
7 | // to COM components. If you need to access a type in this assembly from
8 | // COM, set the ComVisible attribute to true on that type.
9 |
10 | [assembly: ComVisible(false)]
11 |
12 | // The following GUID is for the ID of the typelib if this project is exposed to COM
13 |
14 | [assembly: Guid("c928c55d-bec3-42cd-a775-bbb19c00f2bb")]
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2018 Eric
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
--------------------------------------------------------------------------------
/PECmd.sln:
--------------------------------------------------------------------------------
1 |
2 | Microsoft Visual Studio Solution File, Format Version 12.00
3 | # Visual Studio Version 16
4 | VisualStudioVersion = 16.0.29009.5
5 | MinimumVisualStudioVersion = 10.0.40219.1
6 | Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "PECmd", "PECmd\PECmd.csproj", "{C928C55D-BEC3-42CD-A775-BBB19C00F2BB}"
7 | EndProject
8 | Global
9 | GlobalSection(SolutionConfigurationPlatforms) = preSolution
10 | Debug|Any CPU = Debug|Any CPU
11 | Release|Any CPU = Release|Any CPU
12 | EndGlobalSection
13 | GlobalSection(ProjectConfigurationPlatforms) = postSolution
14 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
15 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Debug|Any CPU.Build.0 = Debug|Any CPU
16 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Release|Any CPU.ActiveCfg = Release|Any CPU
17 | {C928C55D-BEC3-42CD-A775-BBB19C00F2BB}.Release|Any CPU.Build.0 = Release|Any CPU
18 | EndGlobalSection
19 | GlobalSection(SolutionProperties) = preSolution
20 | HideSolutionNode = FALSE
21 | EndGlobalSection
22 | GlobalSection(ExtensibilityGlobals) = postSolution
23 | SolutionGuid = {BF3CFD80-33FF-4388-AC41-71A6FD96A6DA}
24 | EndGlobalSection
25 | EndGlobal
26 |
--------------------------------------------------------------------------------
/PECmd/PECmd.csproj:
--------------------------------------------------------------------------------
1 |
2 |
3 | Exe
4 | net462;net6.0;net9.0
5 | true
6 | PECmd
7 | Eric Zimmerman
8 | PECmd
9 | Prefetch Explorer Command Line Edition
10 | Eric Zimmerman
11 | 10
12 | 1.5.1
13 | true
14 |
15 |
16 | PcDesktopConfigure.ico
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 | all
34 |
35 |
36 |
37 |
38 | all
39 |
40 |
41 |
42 |
43 |
44 |
--------------------------------------------------------------------------------
/.gitattributes:
--------------------------------------------------------------------------------
1 | ###############################################################################
2 | # Set default behavior to automatically normalize line endings.
3 | ###############################################################################
4 | * text=auto
5 |
6 | ###############################################################################
7 | # Set default behavior for command prompt diff.
8 | #
9 | # This is need for earlier builds of msysgit that does not have it on by
10 | # default for csharp files.
11 | # Note: This is only used by command line
12 | ###############################################################################
13 | #*.cs diff=csharp
14 |
15 | ###############################################################################
16 | # Set the merge driver for project and solution files
17 | #
18 | # Merging from the command prompt will add diff markers to the files if there
19 | # are conflicts (Merging from VS is not affected by the settings below, in VS
20 | # the diff markers are never inserted). Diff markers may cause the following
21 | # file extensions to fail to load in VS. An alternative would be to treat
22 | # these files as binary and thus will always conflict and require user
23 | # intervention with every merge. To do so, just uncomment the entries below
24 | ###############################################################################
25 | #*.sln merge=binary
26 | #*.csproj merge=binary
27 | #*.vbproj merge=binary
28 | #*.vcxproj merge=binary
29 | #*.vcproj merge=binary
30 | #*.dbproj merge=binary
31 | #*.fsproj merge=binary
32 | #*.lsproj merge=binary
33 | #*.wixproj merge=binary
34 | #*.modelproj merge=binary
35 | #*.sqlproj merge=binary
36 | #*.wwaproj merge=binary
37 |
38 | ###############################################################################
39 | # behavior for image files
40 | #
41 | # image files are treated as binary by default.
42 | ###############################################################################
43 | #*.jpg binary
44 | #*.png binary
45 | #*.gif binary
46 |
47 | ###############################################################################
48 | # diff behavior for common document formats
49 | #
50 | # Convert binary document formats to text before diffing them. This feature
51 | # is only available from the command line. Turn it on by uncommenting the
52 | # entries below.
53 | ###############################################################################
54 | #*.doc diff=astextplain
55 | #*.DOC diff=astextplain
56 | #*.docx diff=astextplain
57 | #*.DOCX diff=astextplain
58 | #*.dot diff=astextplain
59 | #*.DOT diff=astextplain
60 | #*.pdf diff=astextplain
61 | #*.PDF diff=astextplain
62 | #*.rtf diff=astextplain
63 | #*.RTF diff=astextplain
64 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # PECmd
2 |
3 | ## Command Line Interface
4 |
5 | PECmd version 1.4.0.0
6 |
7 | Author: Eric Zimmerman (saericzimmerman@gmail.com)
8 | https://github.com/EricZimmerman/PECmd
9 |
10 | d Directory to recursively process. Either this or -f is required
11 | f File to process. Either this or -d is required
12 | k Comma separated list of keywords to highlight in output. By default, 'temp' and 'tmp' are highlighted. Any additional keywords will be added to these.
13 | o When specified, save prefetch file bytes to the given path. Useful to look at decompressed Win10 files
14 | q Do not dump full details about each file processed. Speeds up processing when using --json or --csv. Default is FALSE
15 |
16 | json Directory to save json representation to.
17 | jsonf File name to save JSON formatted results to. When present, overrides default name
18 | csv Directory to save CSV results to. Be sure to include the full path in double quotes
19 | csvf File name to save CSV formatted results to. When present, overrides default name
20 | html Directory to save xhtml formatted results to. Be sure to include the full path in double quotes
21 | dt The custom date/time format to use when displaying timestamps. See https://goo.gl/CNVq0k for options. Default is: yyyy-MM-dd HH:mm:ss
22 | mp When true, display higher precision for timestamps. Default is FALSE
23 |
24 | vss Process all Volume Shadow Copies that exist on drive specified by -f or -d . Default is FALSE
25 | dedupe Deduplicate -f or -d & VSCs based on SHA-1. First file found wins. Default is TRUE
26 |
27 | debug Show debug information during processing
28 | trace Show trace information during processing
29 |
30 | Examples: PECmd.exe -f "C:\Temp\CALC.EXE-3FBEF7FD.pf"
31 | PECmd.exe -f "C:\Temp\CALC.EXE-3FBEF7FD.pf" --json "D:\jsonOutput" --jsonpretty
32 | PECmd.exe -d "C:\Temp" -k "system32, fonts"
33 | PECmd.exe -d "C:\Temp" --csv "c:\temp" --csvf foo.csv --json c:\temp\json
34 | PECmd.exe -d "C:\Windows\Prefetch"
35 |
36 | Short options (single letter) are prefixed with a single dash. Long commands are prefixed with two dashes
37 |
38 | ## Documentation
39 |
40 | If you are running less than Windows 8 you will NOT be able to process Windows 10 prefetch files.
41 |
42 | [Windows Prefetch parser in C#](https://binaryforay.blogspot.com/2016/01/windows-prefetch-parser-in-c.html)
43 | [Introducing PECmd!](https://binaryforay.blogspot.com/2016/01/introducing-pecmd.html)
44 | [PECmd v0.6.0.0 released](https://binaryforay.blogspot.com/2016/01/pecmd-v0600-released.html)
45 | [PECmd, LECmd, and JLECmd updated!](https://binaryforay.blogspot.com/2016/03/pecmd-lecmd-and-jlecmd-updated.html)
46 |
47 | # Download Eric Zimmerman's Tools
48 |
49 | All of Eric Zimmerman's tools can be downloaded [here](https://ericzimmerman.github.io/#!index.md).
50 |
51 | # Special Thanks
52 |
53 | Open Source Development funding and support provided by the following contributors:
54 | - [SANS Institute](http://sans.org/) and [SANS DFIR](http://dfir.sans.org/).
55 | - [Tines](https://www.tines.com/?utm_source=oss&utm_medium=sponsorship&utm_campaign=ericzimmerman)
56 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | ## Ignore Visual Studio temporary files, build results, and
2 | ## files generated by popular Visual Studio add-ons.
3 |
4 | # User-specific files
5 | *.suo
6 | *.user
7 | *.userosscache
8 | *.sln.docstates
9 |
10 | # User-specific files (MonoDevelop/Xamarin Studio)
11 | *.userprefs
12 |
13 | # Build results
14 | [Dd]ebug/
15 | [Dd]ebugPublic/
16 | [Rr]elease/
17 | [Rr]eleases/
18 | x64/
19 | x86/
20 | build/
21 | bld/
22 | [Bb]in/
23 | [Oo]bj/
24 |
25 | # Visual Studio 2015 cache/options directory
26 | .vs/
27 |
28 | # MSTest test Results
29 | [Tt]est[Rr]esult*/
30 | [Bb]uild[Ll]og.*
31 |
32 | # NUNIT
33 | *.VisualState.xml
34 | TestResult.xml
35 |
36 | # Build Results of an ATL Project
37 | [Dd]ebugPS/
38 | [Rr]eleasePS/
39 | dlldata.c
40 |
41 | # DNX
42 | project.lock.json
43 | artifacts/
44 |
45 | *_i.c
46 | *_p.c
47 | *_i.h
48 | *.ilk
49 | *.meta
50 | *.obj
51 | *.pch
52 | *.pdb
53 | *.pgc
54 | *.pgd
55 | *.rsp
56 | *.sbr
57 | *.tlb
58 | *.tli
59 | *.tlh
60 | *.tmp
61 | *.tmp_proj
62 | *.log
63 | *.vspscc
64 | *.vssscc
65 | .builds
66 | *.pidb
67 | *.svclog
68 | *.scc
69 |
70 | # Chutzpah Test files
71 | _Chutzpah*
72 |
73 | # Visual C++ cache files
74 | ipch/
75 | *.aps
76 | *.ncb
77 | *.opensdf
78 | *.sdf
79 | *.cachefile
80 |
81 | # Visual Studio profiler
82 | *.psess
83 | *.vsp
84 | *.vspx
85 |
86 | # TFS 2012 Local Workspace
87 | $tf/
88 |
89 | # Guidance Automation Toolkit
90 | *.gpState
91 |
92 | # ReSharper is a .NET coding add-in
93 | _ReSharper*/
94 | *.[Rr]e[Ss]harper
95 | *.DotSettings.user
96 |
97 | # JustCode is a .NET coding add-in
98 | .JustCode
99 |
100 | # TeamCity is a build add-in
101 | _TeamCity*
102 |
103 | # DotCover is a Code Coverage Tool
104 | *.dotCover
105 |
106 | # NCrunch
107 | _NCrunch_*
108 | .*crunch*.local.xml
109 |
110 | # MightyMoose
111 | *.mm.*
112 | AutoTest.Net/
113 |
114 | # Web workbench (sass)
115 | .sass-cache/
116 |
117 | # Installshield output folder
118 | [Ee]xpress/
119 |
120 | # DocProject is a documentation generator add-in
121 | DocProject/buildhelp/
122 | DocProject/Help/*.HxT
123 | DocProject/Help/*.HxC
124 | DocProject/Help/*.hhc
125 | DocProject/Help/*.hhk
126 | DocProject/Help/*.hhp
127 | DocProject/Help/Html2
128 | DocProject/Help/html
129 |
130 | # Click-Once directory
131 | publish/
132 |
133 | # Publish Web Output
134 | *.[Pp]ublish.xml
135 | *.azurePubxml
136 | ## TODO: Comment the next line if you want to checkin your
137 | ## web deploy settings but do note that will include unencrypted
138 | ## passwords
139 | #*.pubxml
140 |
141 | *.publishproj
142 |
143 | # NuGet Packages
144 | *.nupkg
145 | # The packages folder can be ignored because of Package Restore
146 | **/packages/*
147 | # except build/, which is used as an MSBuild target.
148 | !**/packages/build/
149 | # Uncomment if necessary however generally it will be regenerated when needed
150 | #!**/packages/repositories.config
151 |
152 | # Windows Azure Build Output
153 | csx/
154 | *.build.csdef
155 |
156 | # Windows Store app package directory
157 | AppPackages/
158 |
159 | # Visual Studio cache files
160 | # files ending in .cache can be ignored
161 | *.[Cc]ache
162 | # but keep track of directories ending in .cache
163 | !*.[Cc]ache/
164 |
165 | # Others
166 | ClientBin/
167 | [Ss]tyle[Cc]op.*
168 | ~$*
169 | *~
170 | *.dbmdl
171 | *.dbproj.schemaview
172 | *.pfx
173 | *.publishsettings
174 | node_modules/
175 | orleans.codegen.cs
176 |
177 | # RIA/Silverlight projects
178 | Generated_Code/
179 |
180 | # Backup & report files from converting an old project file
181 | # to a newer Visual Studio version. Backup files are not needed,
182 | # because we have git ;-)
183 | _UpgradeReport_Files/
184 | Backup*/
185 | UpgradeLog*.XML
186 | UpgradeLog*.htm
187 |
188 | # SQL Server files
189 | *.mdf
190 | *.ldf
191 |
192 | # Business Intelligence projects
193 | *.rdl.data
194 | *.bim.layout
195 | *.bim_*.settings
196 |
197 | # Microsoft Fakes
198 | FakesAssemblies/
199 |
200 | # Node.js Tools for Visual Studio
201 | .ntvs_analysis.dat
202 |
203 | # Visual Studio 6 build log
204 | *.plg
205 |
206 | # Visual Studio 6 workspace options file
207 | *.opt
208 |
209 | # LightSwitch generated files
210 | GeneratedArtifacts/
211 | _Pvt_Extensions/
212 | ModelManifest.xml
213 |
--------------------------------------------------------------------------------
/PECmd/FodyWeavers.xsd:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 | A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks
13 |
14 |
15 |
16 |
17 | A list of assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.
18 |
19 |
20 |
21 |
22 | A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with line breaks
23 |
24 |
25 |
26 |
27 | A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with line breaks.
28 |
29 |
30 |
31 |
32 | Obsolete, use UnmanagedWinX86Assemblies instead
33 |
34 |
35 |
36 |
37 | A list of unmanaged X86 (32 bit) assembly names to include, delimited with line breaks.
38 |
39 |
40 |
41 |
42 | Obsolete, use UnmanagedWinX64Assemblies instead.
43 |
44 |
45 |
46 |
47 | A list of unmanaged X64 (64 bit) assembly names to include, delimited with line breaks.
48 |
49 |
50 |
51 |
52 | A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with line breaks.
53 |
54 |
55 |
56 |
57 | The order of preloaded assemblies, delimited with line breaks.
58 |
59 |
60 |
61 |
62 |
63 | This will copy embedded files to disk before loading them into memory. This is helpful for some scenarios that expected an assembly to be loaded from a physical file.
64 |
65 |
66 |
67 |
68 | Controls if .pdbs for reference assemblies are also embedded.
69 |
70 |
71 |
72 |
73 | Controls if runtime assemblies are also embedded.
74 |
75 |
76 |
77 |
78 | Controls whether the runtime assemblies are embedded with their full path or only with their assembly name.
79 |
80 |
81 |
82 |
83 | Embedded assemblies are compressed by default, and uncompressed when they are loaded. You can turn compression off with this option.
84 |
85 |
86 |
87 |
88 | As part of Costura, embedded assemblies are no longer included as part of the build. This cleanup can be turned off.
89 |
90 |
91 |
92 |
93 | The attach method no longer subscribes to the `AppDomain.AssemblyResolve` (.NET 4.x) and `AssemblyLoadContext.Resolving` (.NET 6.0+) events.
94 |
95 |
96 |
97 |
98 | Costura by default will load as part of the module initialization. This flag disables that behavior. Make sure you call CosturaUtility.Initialize() somewhere in your code.
99 |
100 |
101 |
102 |
103 | Costura will by default use assemblies with a name like 'resources.dll' as a satellite resource and prepend the output path. This flag disables that behavior.
104 |
105 |
106 |
107 |
108 | A list of assembly names to exclude from the default action of "embed all Copy Local references", delimited with |
109 |
110 |
111 |
112 |
113 | A list of assembly names to include from the default action of "embed all Copy Local references", delimited with |.
114 |
115 |
116 |
117 |
118 | A list of runtime assembly names to exclude from the default action of "embed all Copy Local references", delimited with |
119 |
120 |
121 |
122 |
123 | A list of runtime assembly names to include from the default action of "embed all Copy Local references", delimited with |.
124 |
125 |
126 |
127 |
128 | Obsolete, use UnmanagedWinX86Assemblies instead
129 |
130 |
131 |
132 |
133 | A list of unmanaged X86 (32 bit) assembly names to include, delimited with |.
134 |
135 |
136 |
137 |
138 | Obsolete, use UnmanagedWinX64Assemblies instead
139 |
140 |
141 |
142 |
143 | A list of unmanaged X64 (64 bit) assembly names to include, delimited with |.
144 |
145 |
146 |
147 |
148 | A list of unmanaged Arm64 (64 bit) assembly names to include, delimited with |.
149 |
150 |
151 |
152 |
153 | The order of preloaded assemblies, delimited with |.
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 | 'true' to run assembly verification (PEVerify) on the target assembly after all weavers have been executed.
162 |
163 |
164 |
165 |
166 | A comma-separated list of error codes that can be safely ignored in assembly verification.
167 |
168 |
169 |
170 |
171 | 'false' to turn off automatic generation of the XML Schema file.
172 |
173 |
174 |
175 |
176 |
--------------------------------------------------------------------------------
/PECmd.saproj:
--------------------------------------------------------------------------------
1 |
2 | .\PECmd\bin\Release\PECmd.exe
3 | PECmd
4 | Eric Zimmerman
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 | PECmd
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
211 |
212 |
213 |
214 |
215 |
216 |
217 |
218 |
219 |
220 |
221 |
222 |
223 |
224 |
225 |
226 |
227 |
228 |
229 |
230 |
231 |
232 |
233 |
234 |
235 |
236 |
237 |
238 |
239 |
240 |
241 |
242 |
243 |
244 |
245 |
--------------------------------------------------------------------------------
/PECmd/Program.cs:
--------------------------------------------------------------------------------
1 | using System;
2 | using System.Collections.Generic;
3 | using System.CommandLine;
4 | using System.CommandLine.Help;
5 | using System.CommandLine.NamingConventionBinder;
6 | using System.ComponentModel;
7 | using System.Diagnostics;
8 | using System.Globalization;
9 | using System.IO;
10 | using System.Linq;
11 | using System.Reflection;
12 | using System.Runtime.InteropServices;
13 | using System.Security.Principal;
14 | using System.Text;
15 | using System.Threading.Tasks;
16 | using System.Xml;
17 | using Exceptionless;
18 |
19 | using Prefetch;
20 | using RawCopy;
21 | using Serilog;
22 | using Serilog.Core;
23 | using Serilog.Events;
24 | using ServiceStack;
25 | using ServiceStack.Text;
26 | using CsvWriter = CsvHelper.CsvWriter;
27 | using Version = Prefetch.Version;
28 | #if NET462
29 | using Directory = Alphaleonis.Win32.Filesystem.Directory;
30 | using File = Alphaleonis.Win32.Filesystem.File;
31 | using FileInfo = Alphaleonis.Win32.Filesystem.FileInfo;
32 | using Path = Alphaleonis.Win32.Filesystem.Path;
33 | #else
34 | using Directory = System.IO.Directory;
35 | using File = System.IO.File;
36 | using Path = System.IO.Path;
37 | #endif
38 |
39 | namespace PECmd;
40 |
41 | internal class Program
42 | {
43 | private const string VssDir = @"C:\___vssMount";
44 |
45 | private static readonly string PreciseTimeFormat = "yyyy-MM-dd HH:mm:ss.fffffff";
46 |
47 | private static string ActiveDateTimeFormat;
48 |
49 | private static HashSet _keywords;
50 |
51 | private static List _failedFiles;
52 |
53 | private static List _processedFiles;
54 |
55 | private static readonly string Header =
56 | $"PECmd version {Assembly.GetExecutingAssembly().GetName().Version}" +
57 | "\r\n\r\nAuthor: Eric Zimmerman (saericzimmerman@gmail.com)" +
58 | "\r\nhttps://github.com/EricZimmerman/PECmd";
59 |
60 | private static readonly string Footer = @"Examples: PECmd.exe -f ""C:\Temp\CALC.EXE-3FBEF7FD.pf""" + "\r\n\t " +
61 | @" PECmd.exe -f ""C:\Temp\CALC.EXE-3FBEF7FD.pf"" --json ""D:\jsonOutput""" +
62 | "\r\n\t " +
63 | @" PECmd.exe -d ""C:\Temp"" -k ""system32, fonts""" + "\r\n\t " +
64 | @" PECmd.exe -d ""C:\Temp"" --csv ""c:\temp"" --csvf foo.csv --json c:\temp\json" +
65 | "\r\n\t " +
66 | @" PECmd.exe -d ""C:\Windows\Prefetch""" + "\r\n\t " +
67 | "\r\n\t" +
68 | " Short options (single letter) are prefixed with a single dash. Long commands are prefixed with two dashes";
69 |
70 | private static RootCommand _rootCommand;
71 |
72 | private static readonly string BaseDirectory = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
73 |
74 | private static bool IsAdministrator()
75 | {
76 | if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
77 | {
78 | return true;
79 | }
80 |
81 | var identity = WindowsIdentity.GetCurrent();
82 | var principal = new WindowsPrincipal(identity);
83 | return principal.IsInRole(WindowsBuiltInRole.Administrator);
84 | }
85 |
86 | private static async Task Main(string[] args)
87 | {
88 | ExceptionlessClient.Default.Startup("x3MPpeQSBUUsXl3DjekRQ9kYjyN3cr5JuwdoOBpZ");
89 |
90 | _keywords = new HashSet { "temp", "tmp" };
91 |
92 | _rootCommand = new RootCommand
93 | {
94 | new Option(
95 | "-f",
96 | "File to process. Either this or -d is required"),
97 |
98 | new Option(
99 | "-d",
100 | "Directory to recursively process. Either this or -f is required"),
101 |
102 |
103 | new Option(
104 | "-k",
105 | "Comma separated list of keywords to highlight in output. By default, 'temp' and 'tmp' are highlighted. Any additional keywords will be added to these"),
106 |
107 | new Option(
108 | "-o",
109 | "When specified, save prefetch file bytes to the given path. Useful to look at decompressed Win10 files"),
110 |
111 | new Option(
112 | "-q",
113 | getDefaultValue:()=>false,
114 | "Do not dump full details about each file processed. Speeds up processing when using --json or --csv"),
115 |
116 | new Option(
117 | "--json",
118 | "Directory to save JSON formatted results to. Be sure to include the full path in double quotes"),
119 |
120 | new Option(
121 | "--jsonf",
122 | "File name to save JSON formatted results to. When present, overrides default name"),
123 |
124 | new Option(
125 | "--csv",
126 | "Directory to save CSV formatted results to. Be sure to include the full path in double quotes"),
127 |
128 | new Option(
129 | "--csvf",
130 | "File name to save CSV formatted results to. When present, overrides default name\r\n"),
131 |
132 | new Option(
133 | "--html",
134 | "Directory to save xhtml formatted results to. Be sure to include the full path in double quotes"),
135 |
136 | new Option(
137 | "--dt",
138 | getDefaultValue:()=>"yyyy-MM-dd HH:mm:ss",
139 | "The custom date/time format to use when displaying time stamps. See https://goo.gl/CNVq0k for options"),
140 |
141 | new Option(
142 | "--mp",
143 | getDefaultValue:()=>false,
144 | "When true, display higher precision for timestamps"),
145 | new Option(
146 | "--vss",
147 | getDefaultValue:()=>false,
148 | "Process all Volume Shadow Copies that exist on drive specified by -f or -d"),
149 | new Option(
150 | "--dedupe",
151 | getDefaultValue:()=>false,
152 | "Deduplicate -f or -d & VSCs based on SHA-1. First file found wins"),
153 | new Option(
154 | "--debug",
155 | getDefaultValue:()=>false,
156 | "Show debug information during processing"),
157 | new Option(
158 | "--trace",
159 | getDefaultValue:()=>false,
160 | "Show trace information during processing"),
161 | };
162 |
163 | _rootCommand.Description = Header + "\r\n\r\n" + Footer;
164 |
165 | _rootCommand.Handler = CommandHandler.Create(DoWork);
166 |
167 | await _rootCommand.InvokeAsync(args);
168 |
169 | Log.CloseAndFlush();
170 | }
171 |
172 |
173 | private static void DoWork(string f, string d, string k, string o, bool q, string json, string jsonf, string csv, string csvf, string html, string dt, bool mp, bool vss, bool dedupe, bool debug, bool trace)
174 | {
175 | var levelSwitch = new LoggingLevelSwitch();
176 |
177 | ActiveDateTimeFormat = dt;
178 |
179 | if (mp)
180 | {
181 | ActiveDateTimeFormat = PreciseTimeFormat;
182 | }
183 |
184 | var formatter =
185 | new DateTimeOffsetFormatter(CultureInfo.CurrentCulture);
186 |
187 |
188 | var template = "{Message:lj}{NewLine}{Exception}";
189 |
190 | if (debug)
191 | {
192 | levelSwitch.MinimumLevel = LogEventLevel.Debug;
193 | template = "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj}{NewLine}{Exception}";
194 | }
195 |
196 | if (trace)
197 | {
198 | levelSwitch.MinimumLevel = LogEventLevel.Verbose;
199 | template = "[{Timestamp:HH:mm:ss.fff} {Level:u3}] {Message:lj}{NewLine}{Exception}";
200 | }
201 |
202 | var conf = new LoggerConfiguration()
203 | .WriteTo.Console(outputTemplate: template,formatProvider: formatter)
204 | .MinimumLevel.ControlledBy(levelSwitch);
205 |
206 | Log.Logger = conf.CreateLogger();
207 |
208 | if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
209 | {
210 | Console.WriteLine();
211 | Log.Fatal("Non-Windows platforms not supported due to the need to load decompression specific Windows libraries! Exiting...");
212 | Console.WriteLine();
213 | Environment.Exit(0);
214 | return;
215 | }
216 |
217 | if (f.IsNullOrEmpty() && d.IsNullOrEmpty())
218 | {
219 | var helpBld = new HelpBuilder(LocalizationResources.Instance, Console.WindowWidth);
220 | var hc = new HelpContext(helpBld, _rootCommand, Console.Out);
221 |
222 | helpBld.Write(hc);
223 |
224 | Log.Warning("Either -f or -d is required. Exiting");
225 | return;
226 | }
227 |
228 | if (f.IsNullOrEmpty() == false &&
229 | !File.Exists(f))
230 | {
231 | Log.Warning("File {F} not found. Exiting",f);
232 | return;
233 | }
234 |
235 | if (d.IsNullOrEmpty() == false &&
236 | !Directory.Exists(d))
237 | {
238 | Log.Warning("Directory {D} not found. Exiting",d);
239 | return;
240 | }
241 |
242 | if (k?.Length > 0)
243 | {
244 | var kws = k.ToLowerInvariant().Split(new[] { ',' },
245 | StringSplitOptions.RemoveEmptyEntries);
246 |
247 | foreach (var kw in kws)
248 | {
249 | _keywords.Add(kw.Trim());
250 | }
251 | }
252 |
253 | Log.Information("{Header}",Header);
254 | Console.WriteLine();
255 |
256 | Log.Information("Command line: {Args}",string.Join(" ", Environment.GetCommandLineArgs().Skip(1)));
257 |
258 | if (IsAdministrator() == false)
259 | {
260 | Console.WriteLine();
261 | Log.Information("Warning: Administrator privileges not found!");
262 | }
263 |
264 | if (vss & (IsAdministrator() == false))
265 | {
266 | if (!RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
267 | {
268 | vss = false;
269 | Log.Warning("--vss is not supported on non-Windows platforms. Disabling...");
270 | }
271 | }
272 |
273 | if (vss & (IsAdministrator() == false))
274 | {
275 | Log.Error("--vss is present, but administrator rights not found. Exiting");
276 | Console.WriteLine();
277 | return;
278 | }
279 |
280 | Console.WriteLine();
281 | Log.Information("Keywords: {Keywords}",string.Join(", ", _keywords));
282 | Console.WriteLine();
283 |
284 |
285 | if (vss)
286 | {
287 | string driveLetter;
288 | if (f.IsEmpty() == false)
289 | {
290 | driveLetter = Path.GetPathRoot(Path.GetFullPath(f))
291 | .Substring(0, 1);
292 | }
293 | else
294 | {
295 | driveLetter = Path.GetPathRoot(Path.GetFullPath(d))
296 | .Substring(0, 1);
297 | }
298 |
299 | Helper.MountVss(driveLetter, VssDir);
300 | Console.WriteLine();
301 | }
302 |
303 | _processedFiles = new List();
304 |
305 | _failedFiles = new List();
306 |
307 | if (f?.Length > 0)
308 | {
309 | try
310 | {
311 | var pf = LoadFile(f, q, ActiveDateTimeFormat);
312 |
313 | if (pf != null)
314 | {
315 | if (o.IsNullOrEmpty() == false)
316 | {
317 | try
318 | {
319 | if (Directory.Exists(Path.GetDirectoryName(o)) ==
320 | false)
321 | {
322 | Directory.CreateDirectory(
323 | Path.GetDirectoryName(o));
324 | }
325 |
326 | PrefetchFile.SavePrefetch(o, pf);
327 | Log.Information("Saved prefetch bytes to {O}",o);
328 | }
329 | catch (Exception e)
330 | {
331 | Log.Error(e,"Unable to save prefetch file. Error: {Message}",e.Message);
332 | }
333 | }
334 |
335 | _processedFiles.Add(pf);
336 | }
337 |
338 | if (vss)
339 | {
340 | var vssDirs = Directory.GetDirectories(VssDir);
341 |
342 | var root = Path.GetPathRoot(Path.GetFullPath(f));
343 | var stem = Path.GetFullPath(f).Replace(root, "");
344 |
345 | foreach (var vssDir in vssDirs)
346 | {
347 | var newPath = Path.Combine(vssDir, stem);
348 | if (File.Exists(newPath))
349 | {
350 | pf = LoadFile(newPath, q, ActiveDateTimeFormat);
351 | if (pf != null)
352 | {
353 | _processedFiles.Add(pf);
354 | }
355 | }
356 | }
357 | }
358 | }
359 | catch (UnauthorizedAccessException ex)
360 | {
361 | Log.Error(ex,
362 | "Unable to access {F}. Are you running as an administrator? Error: {Message}",f,ex.Message);
363 | }
364 | catch (Exception ex)
365 | {
366 | Log.Error(ex,
367 | "Error parsing prefetch file {F}. Error: {Message}",f,ex.Message);
368 | }
369 | }
370 | else
371 | {
372 | Log.Information("Looking for prefetch files in {D}",d);
373 | Console.WriteLine();
374 |
375 | var pfFiles = new List();
376 |
377 | IEnumerable files2;
378 |
379 | #if !NET6_0 && !NET9_0
380 | var enumerationFilters = new Alphaleonis.Win32.Filesystem.DirectoryEnumerationFilters();
381 | enumerationFilters.InclusionFilter = fsei =>
382 | {
383 | if (fsei.Extension.ToUpperInvariant() == ".PF")
384 | {
385 | if (File.Exists(fsei.FullPath) == false)
386 | {
387 | return false;
388 | }
389 |
390 | if (fsei.FileSize == 0)
391 | {
392 | Log.Debug("Skipping {FullPath} since size is 0",fsei.FullPath);
393 | return false;
394 | }
395 |
396 | if (fsei.FullPath.ToUpperInvariant().Contains("[ROOT]"))
397 | {
398 | Log.Warning("WARNING: FTK Imager detected! Do not use FTK Imager to mount image files as it does not work properly! Use Arsenal Image Mounter instead");
399 | return true;
400 | }
401 |
402 | var fsi = new FileInfo(fsei.FullPath);
403 | var ads = fsi.EnumerateAlternateDataStreams().Where(t => t.StreamName.Length > 0).ToList();
404 | if (ads.Count > 0)
405 | {
406 | Log.Warning("WARNING: {FullPath} has at least one Alternate Data Stream",fsei.FullPath);
407 | foreach (var alternateDataStreamInfo in ads)
408 | {
409 | Log.Information("Name: {StreamName}",alternateDataStreamInfo.StreamName);
410 |
411 | var s = File.Open(alternateDataStreamInfo.FullPath, FileMode.Open, FileAccess.Read,
412 | FileShare.Read, Alphaleonis.Win32.Filesystem.PathFormat.LongFullPath);
413 |
414 | IPrefetch pf1 = null;
415 |
416 | try
417 | {
418 | pf1 = PrefetchFile.Open(s, $"{fsei.FullPath}:{alternateDataStreamInfo.StreamName}");
419 | }
420 | catch (Exception e)
421 | {
422 | Log.Warning(e,"Could not process {FullPath}. Error: {Message}",fsei.FullPath,e.Message);
423 | }
424 |
425 | Log.Information("---------- Processed {FullPath} ----------",fsei.FullPath);
426 |
427 | if (pf1 != null)
428 | {
429 | if (q == false)
430 | {
431 | DisplayFile(pf1,q,ActiveDateTimeFormat);
432 | }
433 |
434 | _processedFiles.Add(pf1);
435 | }
436 | }
437 |
438 | }
439 |
440 | return true;
441 | }
442 |
443 |
444 | return false;
445 | };
446 |
447 | enumerationFilters.RecursionFilter = entryInfo => !entryInfo.IsMountPoint && !entryInfo.IsSymbolicLink;
448 |
449 | enumerationFilters.ErrorFilter = (errorCode, errorMessage, pathProcessed) => true;
450 |
451 | var dirEnumOptions =
452 | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Files | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.Recursive |
453 | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.SkipReparsePoints | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.ContinueOnException |
454 | Alphaleonis.Win32.Filesystem.DirectoryEnumerationOptions.BasicSearch;
455 |
456 | files2 =
457 | Directory.EnumerateFileSystemEntries(d, dirEnumOptions, enumerationFilters);
458 |
459 | #else
460 |
461 | var options = new EnumerationOptions
462 | {
463 | IgnoreInaccessible = true,
464 | MatchCasing = MatchCasing.CaseInsensitive,
465 | RecurseSubdirectories = true,
466 | AttributesToSkip = 0
467 | };
468 |
469 | files2 = Directory.EnumerateFileSystemEntries(d, "*.pf", options);
470 | #endif
471 |
472 |
473 | try
474 | {
475 | pfFiles.AddRange(files2);
476 |
477 | if (vss)
478 | {
479 | var vssDirs = Directory.GetDirectories(VssDir);
480 |
481 | foreach (var vssDir in vssDirs)
482 | {
483 | var root = Path.GetPathRoot(Path.GetFullPath(d));
484 | var stem = Path.GetFullPath(d).Replace(root, "");
485 |
486 | var target = Path.Combine(vssDir, stem);
487 |
488 | Log.Information("Searching {Target} for prefetch files...",$"VSS{target.Replace($"{VssDir}\\", "")}");
489 |
490 | #if !NET6_0 && !NET9_0
491 | files2 =
492 | Directory.EnumerateFileSystemEntries(target, dirEnumOptions, enumerationFilters);
493 |
494 | #else
495 |
496 | var enumerationOptions = new EnumerationOptions
497 | {
498 | IgnoreInaccessible = true,
499 | MatchCasing = MatchCasing.CaseInsensitive,
500 | RecurseSubdirectories = true,
501 | AttributesToSkip = 0
502 | };
503 |
504 | files2 = Directory.EnumerateFileSystemEntries(target, "*.pf", enumerationOptions);
505 | #endif
506 |
507 | try
508 | {
509 | pfFiles.AddRange(files2);
510 | }
511 | catch (Exception e)
512 | {
513 | Log.Error(e,"Could not access all files in {D}",d);
514 | Console.WriteLine();
515 | Log.Error("Rerun the program with Administrator privileges to try again");
516 | Console.WriteLine();
517 | //Environment.Exit(-1);
518 | }
519 | }
520 | }
521 | }
522 | catch (UnauthorizedAccessException ua)
523 | {
524 | Log.Error(ua,
525 | "Unable to access {D}. Are you running as an administrator? Error: {Message}",d,ua.Message);
526 | return;
527 | }
528 | catch (Exception ex)
529 | {
530 | Log.Error(ex,
531 | "Error getting prefetch files in {D}. Error: {Message}",d,ex.Message);
532 | return;
533 | }
534 |
535 | Console.WriteLine();
536 | Log.Information("Found {Count:N0} Prefetch files",pfFiles.Count);
537 | Console.WriteLine();
538 |
539 | var sw = new Stopwatch();
540 | sw.Start();
541 |
542 | var seenHashes = new HashSet();
543 |
544 | foreach (var file in pfFiles)
545 | {
546 | if (File.Exists(file) == false)
547 | {
548 | Log.Warning("File {File} does not seem to exist any more! Skipping",file);
549 |
550 | continue;
551 | }
552 |
553 | if (dedupe)
554 | {
555 | using var fs = new FileStream(file, FileMode.Open, FileAccess.Read);
556 | var sha = Helper.GetSha1FromStream(fs, 0);
557 | if (seenHashes.Contains(sha))
558 | {
559 | Log.Debug("Skipping {File} as a file with SHA-1 {Sha} has already been processed",file,sha);
560 | continue;
561 | }
562 |
563 | seenHashes.Add(sha);
564 | }
565 |
566 | var pf = LoadFile(file, q, ActiveDateTimeFormat);
567 |
568 | if (pf != null)
569 | {
570 | _processedFiles.Add(pf);
571 | }
572 | }
573 |
574 | sw.Stop();
575 |
576 | if (q)
577 | {
578 | Console.WriteLine();
579 | }
580 |
581 | Log.Information(
582 | "Processed {FileCount:N0} out of {TotalFilesCount:N0} files in {TotalSeconds:N4} seconds",pfFiles.Count - _failedFiles.Count,pfFiles.Count,sw.Elapsed.TotalSeconds);
583 |
584 | if (_failedFiles.Count > 0)
585 | {
586 | Console.WriteLine();
587 | Log.Warning("Failed files");
588 | foreach (var failedFile in _failedFiles)
589 | {
590 | Log.Information(" {FailedFile}",failedFile);
591 | }
592 | }
593 | }
594 |
595 | if (_processedFiles.Count > 0)
596 | {
597 | Console.WriteLine();
598 |
599 | try
600 | {
601 | CsvWriter csvWriter = null;
602 | StreamWriter streamWriter = null;
603 |
604 | CsvWriter csvTl = null;
605 | StreamWriter streamWriterTl = null;
606 |
607 | JsConfig.DateHandler = DateHandler.ISO8601;
608 |
609 | StreamWriter streamWriterJson = null;
610 |
611 | var utcNow = DateTimeOffset.UtcNow;
612 |
613 | if (json?.Length > 0)
614 | {
615 | var outName = $"{utcNow:yyyyMMddHHmmss}_PECmd_Output.json";
616 |
617 | if (Directory.Exists(json) == false)
618 | {
619 | Log.Information("{Json} does not exist. Creating...",json);
620 | Directory.CreateDirectory(json);
621 | }
622 |
623 | if (jsonf.IsNullOrEmpty() == false)
624 | {
625 | outName = Path.GetFileName(jsonf);
626 | }
627 |
628 | var outFile = Path.Combine(json, outName);
629 |
630 | Log.Information("Saving json output to {OutFile}",outFile);
631 |
632 | streamWriterJson = new StreamWriter(outFile);
633 | JsConfig.DateHandler = DateHandler.ISO8601;
634 | }
635 |
636 | if (csv?.Length > 0)
637 | {
638 | var outName = $"{utcNow:yyyyMMddHHmmss}_PECmd_Output.csv";
639 |
640 | if (csvf.IsNullOrEmpty() == false)
641 | {
642 | outName = Path.GetFileName(csvf);
643 | }
644 |
645 | var outNameTl = $"{utcNow:yyyyMMddHHmmss}_PECmd_Output_Timeline.csv";
646 | if (csvf.IsNullOrEmpty() == false)
647 | {
648 | outNameTl =
649 | $"{Path.GetFileNameWithoutExtension(csvf)}_Timeline{Path.GetExtension(csvf)}";
650 | }
651 |
652 |
653 | var outFile = Path.Combine(csv, outName);
654 | var outFileTl = Path.Combine(csv, outNameTl);
655 |
656 |
657 | if (Directory.Exists(csv) == false)
658 | {
659 | Log.Information("Path to {Csv} does not exist. Creating...",csv);
660 | Directory.CreateDirectory(csv);
661 | }
662 |
663 | Log.Information("CSV output will be saved to {OutFile}",outFile);
664 | Log.Information("CSV time line output will be saved to {OutFileTl}",outFileTl);
665 |
666 | try
667 | {
668 | streamWriter = new StreamWriter(outFile);
669 | csvWriter = new CsvWriter(streamWriter, CultureInfo.InvariantCulture);
670 |
671 | csvWriter.WriteHeader(typeof(CsvOut));
672 | csvWriter.NextRecord();
673 |
674 | streamWriterTl = new StreamWriter(outFileTl);
675 | csvTl = new CsvWriter(streamWriterTl, CultureInfo.InvariantCulture);
676 |
677 | csvTl.WriteHeader(typeof(CsvOutTl));
678 | csvTl.NextRecord();
679 | }
680 | catch (Exception ex)
681 | {
682 | Log.Error(ex,
683 | "Unable to open {OutFile} for writing. CSV export canceled. Error: {Message}",outFile,ex.Message);
684 | }
685 | }
686 |
687 |
688 | XmlTextWriter xml = null;
689 |
690 | if (html?.Length > 0)
691 | {
692 | if (Directory.Exists(html) == false)
693 | {
694 | Log.Information("{Html} does not exist. Creating...",html);
695 | Directory.CreateDirectory(html);
696 | }
697 |
698 | var outDir = Path.Combine(html,
699 | $"{DateTimeOffset.UtcNow:yyyyMMddHHmmss}_PECmd_Output_for_{html.Replace(@":\", "_").Replace(@"\", "_")}");
700 |
701 | if (Directory.Exists(outDir) == false)
702 | {
703 | Directory.CreateDirectory(outDir);
704 | }
705 |
706 | var styleDir = Path.Combine(outDir, "styles");
707 | if (Directory.Exists(styleDir) == false)
708 | {
709 | Directory.CreateDirectory(styleDir);
710 | }
711 |
712 | File.WriteAllText(Path.Combine(styleDir, "normalize.css"), Encoding.Default.GetString(Convert.FromBase64String(ExternalFiles.Normalize)));
713 | File.WriteAllText(Path.Combine(styleDir, "style.css"), Encoding.Default.GetString(Convert.FromBase64String(ExternalFiles.Style)));
714 |
715 | if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows))
716 | {
717 | File.WriteAllBytes(Path.Combine(styleDir, "directories.png"),Convert.FromBase64String(ExternalFiles.Directories));
718 | File.WriteAllBytes(Path.Combine(styleDir, "filesloaded.png"),Convert.FromBase64String(ExternalFiles.FilesLoaded));
719 | }
720 |
721 | var outFile = Path.Combine(html, outDir,
722 | "index.xhtml");
723 |
724 | Log.Information("Saving HTML output to {OutFile}",outFile);
725 |
726 | xml = new XmlTextWriter(outFile, Encoding.UTF8)
727 | {
728 | Formatting = Formatting.Indented,
729 | Indentation = 4
730 | };
731 |
732 | xml.WriteStartDocument();
733 |
734 | xml.WriteProcessingInstruction("xml-stylesheet", "href=\"styles/normalize.css\"");
735 | xml.WriteProcessingInstruction("xml-stylesheet", "href=\"styles/style.css\"");
736 |
737 | xml.WriteStartElement("document");
738 | }
739 |
740 | if (csv.IsNullOrEmpty() == false ||
741 | json.IsNullOrEmpty() == false ||
742 | html.IsNullOrEmpty() == false)
743 | {
744 | foreach (var processedFile in _processedFiles)
745 | {
746 | var csvOut = GetCsvFormat(processedFile, ActiveDateTimeFormat);
747 |
748 | var pfname = csvOut.SourceFilename;
749 |
750 | if (csvOut.SourceFilename.StartsWith(VssDir))
751 | {
752 | pfname = $"VSS{csvOut.SourceFilename.Replace($"{VssDir}\\", "")}";
753 | }
754 |
755 | csvOut.SourceFilename = pfname;
756 |
757 | try
758 | {
759 | foreach (var dateTimeOffset in processedFile.LastRunTimes)
760 | {
761 | var t = new CsvOutTl();
762 |
763 | var exePath =
764 | processedFile.Filenames.FirstOrDefault(
765 | y => y.EndsWith(processedFile.Header.ExecutableFilename));
766 |
767 | if (exePath == null)
768 | {
769 | exePath = processedFile.Header.ExecutableFilename;
770 | }
771 |
772 | t.ExecutableName = exePath;
773 | t.RunTime = dateTimeOffset.ToString(ActiveDateTimeFormat);
774 |
775 | csvTl?.WriteRecord(t);
776 | csvTl?.NextRecord();
777 | }
778 | }
779 | catch (Exception ex)
780 | {
781 | Log.Error(ex,
782 | "Error getting time line record for {SourceFilename} to {Csv}. Error: {Message}",processedFile.SourceFilename,csv,ex.Message);
783 | }
784 |
785 | try
786 | {
787 | csvWriter?.WriteRecord(csvOut);
788 | csvWriter?.NextRecord();
789 | }
790 | catch (Exception ex)
791 | {
792 | Log.Error(ex,"Error writing CSV record for {SourceFilename} to {Csv}. Error: {Message}",processedFile.SourceFilename,csv,ex.Message);
793 | }
794 |
795 | //hack
796 | if (streamWriterJson != null)
797 | {
798 | var o1 = GetCsvFormat(processedFile, "o");
799 |
800 | streamWriterJson.WriteLine(o1.ToJson());
801 |
802 | }
803 |
804 |
805 | //XHTML
806 | xml?.WriteStartElement("Container");
807 | xml?.WriteElementString("SourceFile", csvOut.SourceFilename);
808 | xml?.WriteElementString("SourceCreated", csvOut.SourceCreated);
809 | xml?.WriteElementString("SourceModified", csvOut.SourceModified);
810 | xml?.WriteElementString("SourceAccessed", csvOut.SourceAccessed);
811 |
812 | xml?.WriteElementString("LastRun", csvOut.LastRun);
813 |
814 | xml?.WriteElementString("PreviousRun0", $"{csvOut.PreviousRun0}");
815 | xml?.WriteElementString("PreviousRun1", $"{csvOut.PreviousRun1}");
816 | xml?.WriteElementString("PreviousRun2", $"{csvOut.PreviousRun2}");
817 | xml?.WriteElementString("PreviousRun3", $"{csvOut.PreviousRun3}");
818 | xml?.WriteElementString("PreviousRun4", $"{csvOut.PreviousRun4}");
819 | xml?.WriteElementString("PreviousRun5", $"{csvOut.PreviousRun5}");
820 | xml?.WriteElementString("PreviousRun6", $"{csvOut.PreviousRun6}");
821 |
822 | xml?.WriteStartElement("ExecutableName");
823 | xml?.WriteAttributeString("title",
824 | "Note: The name of the executable tracked by the pf file");
825 | xml?.WriteString(csvOut.ExecutableName);
826 | xml?.WriteEndElement();
827 |
828 | xml?.WriteElementString("RunCount", $"{csvOut.RunCount}");
829 |
830 | xml?.WriteStartElement("Size");
831 | xml?.WriteAttributeString("title", "Note: The size of the executable in bytes");
832 | xml?.WriteString(csvOut.Size);
833 | xml?.WriteEndElement();
834 |
835 | xml?.WriteStartElement("Hash");
836 | xml?.WriteAttributeString("title",
837 | "Note: The calculated hash for the pf file that should match the hash in the source file name");
838 | xml?.WriteString(csvOut.Hash);
839 | xml?.WriteEndElement();
840 |
841 | xml?.WriteStartElement("Version");
842 | xml?.WriteAttributeString("title",
843 | "Note: The operating system that generated the prefetch file");
844 | xml?.WriteString(csvOut.Version);
845 | xml?.WriteEndElement();
846 |
847 | xml?.WriteElementString("Note", csvOut.Note);
848 |
849 | xml?.WriteElementString("Volume0Name", csvOut.Volume0Name);
850 | xml?.WriteElementString("Volume0Serial", csvOut.Volume0Serial);
851 | xml?.WriteElementString("Volume0Created", csvOut.Volume0Created);
852 |
853 | xml?.WriteElementString("Volume1Name", csvOut.Volume1Name);
854 | xml?.WriteElementString("Volume1Serial", csvOut.Volume1Serial);
855 | xml?.WriteElementString("Volume1Created", csvOut.Volume1Created);
856 |
857 |
858 | xml?.WriteStartElement("Directories");
859 | xml?.WriteAttributeString("title",
860 | "A comma separated list of all directories accessed by the executable");
861 | xml?.WriteString(csvOut.Directories);
862 | xml?.WriteEndElement();
863 |
864 | xml?.WriteStartElement("FilesLoaded");
865 | xml?.WriteAttributeString("title",
866 | "A comma separated list of all files that were loaded by the executable");
867 | xml?.WriteString(csvOut.FilesLoaded);
868 | xml?.WriteEndElement();
869 |
870 | xml?.WriteEndElement();
871 | }
872 |
873 |
874 | //Close CSV stuff
875 | streamWriter?.Flush();
876 | streamWriter?.Close();
877 |
878 | streamWriterTl?.Flush();
879 | streamWriterTl?.Close();
880 |
881 | //Close XML
882 | xml?.WriteEndElement();
883 | xml?.WriteEndDocument();
884 | xml?.Flush();
885 |
886 | //close json
887 | streamWriterJson?.Flush();
888 | streamWriterJson?.Close();
889 | }
890 | }
891 | catch (Exception ex)
892 | {
893 | Log.Error(ex,"Error exporting data: {Message}",ex.Message);
894 | }
895 | }
896 |
897 | if (vss)
898 | {
899 | if (Directory.Exists(VssDir))
900 | {
901 | foreach (var directory in Directory.GetDirectories(VssDir))
902 | {
903 | Directory.Delete(directory);
904 | }
905 |
906 | #if !NET6_0 && !NET9_0
907 | Directory.Delete(VssDir, true, true);
908 | #else
909 | Directory.Delete(VssDir, true);
910 | #endif
911 | }
912 | }
913 | }
914 |
915 |
916 |
917 | private static CsvOut GetCsvFormat(IPrefetch pf, string dt)
918 | {
919 | var created = pf.SourceCreatedOn;
920 | var modified = pf.SourceModifiedOn;
921 | var accessed = pf.SourceAccessedOn;
922 |
923 | var volDate = string.Empty;
924 | var volName = string.Empty;
925 | var volSerial = string.Empty;
926 |
927 | if (pf.VolumeInformation?.Count > 0)
928 | {
929 | var vol0Create = pf.VolumeInformation[0].CreationTime;
930 |
931 | volDate = vol0Create.ToString(ActiveDateTimeFormat);
932 |
933 | if (vol0Create.Year == 1601)
934 | {
935 | volDate = string.Empty;
936 | }
937 |
938 | volName = pf.VolumeInformation[0].DeviceName;
939 | volSerial = pf.VolumeInformation[0].SerialNumber;
940 | }
941 |
942 | var lrTime = string.Empty;
943 |
944 | if (pf.LastRunTimes.Count > 0)
945 | {
946 | var lr = pf.LastRunTimes[0];
947 |
948 | lrTime = lr.ToString(ActiveDateTimeFormat);
949 | }
950 |
951 |
952 | var csOut = new CsvOut
953 | {
954 | SourceFilename = pf.SourceFilename,
955 | SourceCreated = created.ToString(ActiveDateTimeFormat),
956 | SourceModified = modified.ToString(ActiveDateTimeFormat),
957 | SourceAccessed = accessed.ToString(ActiveDateTimeFormat),
958 | Hash = pf.Header.Hash,
959 | ExecutableName = pf.Header.ExecutableFilename,
960 | Size = pf.Header.FileSize.ToString(),
961 | Version = GetDescriptionFromEnumValue(pf.Header.Version),
962 | RunCount = pf.RunCount.ToString(),
963 | Volume0Created = volDate,
964 | Volume0Name = volName,
965 | Volume0Serial = volSerial,
966 | LastRun = lrTime,
967 | ParsingError = pf.ParsingError
968 | };
969 |
970 | if (pf.LastRunTimes.Count > 1)
971 | {
972 | var lrt = pf.LastRunTimes[1];
973 | csOut.PreviousRun0 = lrt.ToString(ActiveDateTimeFormat);
974 | }
975 |
976 | if (pf.LastRunTimes.Count > 2)
977 | {
978 | var lrt = pf.LastRunTimes[2];
979 | csOut.PreviousRun1 = lrt.ToString(ActiveDateTimeFormat);
980 | }
981 |
982 | if (pf.LastRunTimes.Count > 3)
983 | {
984 | var lrt = pf.LastRunTimes[3];
985 | csOut.PreviousRun2 = lrt.ToString(ActiveDateTimeFormat);
986 | }
987 |
988 | if (pf.LastRunTimes.Count > 4)
989 | {
990 | var lrt = pf.LastRunTimes[4];
991 | csOut.PreviousRun3 = lrt.ToString(ActiveDateTimeFormat);
992 | }
993 |
994 | if (pf.LastRunTimes.Count > 5)
995 | {
996 | var lrt = pf.LastRunTimes[5];
997 | csOut.PreviousRun4 = lrt.ToString(ActiveDateTimeFormat);
998 | }
999 |
1000 | if (pf.LastRunTimes.Count > 6)
1001 | {
1002 | var lrt = pf.LastRunTimes[6];
1003 | csOut.PreviousRun5 = lrt.ToString(ActiveDateTimeFormat);
1004 | }
1005 |
1006 | if (pf.LastRunTimes.Count > 7)
1007 | {
1008 | var lrt = pf.LastRunTimes[7];
1009 | csOut.PreviousRun6 = lrt.ToString(ActiveDateTimeFormat);
1010 | }
1011 |
1012 | if (pf.VolumeInformation?.Count > 1)
1013 | {
1014 | var vol1 = pf.VolumeInformation[1].CreationTime;
1015 | csOut.Volume1Created = vol1.ToString(ActiveDateTimeFormat);
1016 | csOut.Volume1Name = pf.VolumeInformation[1].DeviceName;
1017 | csOut.Volume1Serial = pf.VolumeInformation[1].SerialNumber;
1018 | }
1019 |
1020 | if (pf.VolumeInformation?.Count > 2)
1021 | {
1022 | csOut.Note = "File contains > 2 volumes! Please inspect output from main program for full details!";
1023 | }
1024 |
1025 | var sbDirs = new StringBuilder();
1026 | if (pf.VolumeInformation != null)
1027 | {
1028 | foreach (var volumeInfo in pf.VolumeInformation)
1029 | {
1030 | sbDirs.Append(string.Join(", ", volumeInfo.DirectoryNames));
1031 | }
1032 | }
1033 |
1034 |
1035 | if (pf.ParsingError)
1036 | {
1037 | return csOut;
1038 | }
1039 |
1040 | csOut.Directories = sbDirs.ToString();
1041 |
1042 | csOut.FilesLoaded = string.Join(", ", pf.Filenames);
1043 |
1044 | return csOut;
1045 | }
1046 |
1047 |
1048 | private static string GetDescriptionFromEnumValue(Enum value)
1049 | {
1050 | var attribute = value.GetType()
1051 | .GetField(value.ToString())
1052 | ?.GetCustomAttributes(typeof(DescriptionAttribute), false)
1053 | .SingleOrDefault() as DescriptionAttribute;
1054 | return attribute?.Description;
1055 | }
1056 |
1057 | private static void DisplayFile(IPrefetch pf, bool q, string dt)
1058 | {
1059 | if (pf.ParsingError)
1060 | {
1061 | _failedFiles.Add($"{pf.SourceFilename} is corrupt and did not parse completely!");
1062 | Log.Warning("{SourceFilename} FILE DID NOT PARSE COMPLETELY!",pf.SourceFilename);
1063 | Console.WriteLine();
1064 | }
1065 |
1066 | if (q == false)
1067 | {
1068 | if (pf.ParsingError)
1069 | {
1070 | Log.Warning("PARTIAL OUTPUT SHOWN BELOW");
1071 | Console.WriteLine();
1072 | }
1073 |
1074 |
1075 | var created = pf.SourceCreatedOn;
1076 | var modified = pf.SourceModifiedOn;
1077 | var accessed = pf.SourceAccessedOn;
1078 |
1079 | Log.Information("Created on: {CreatedOn}",created);
1080 | Log.Information("Modified on: {Modified}",modified);
1081 | Log.Information("Last accessed on: {Accessed}",accessed);
1082 | Console.WriteLine();
1083 |
1084 | Log.Information("Executable name: {ExecutableFilename}",pf.Header.ExecutableFilename);
1085 | Log.Information("Hash: {Hash}",pf.Header.Hash);
1086 | Log.Information("File size (bytes): {FileSize:N0}",pf.Header.FileSize);
1087 | Log.Information("Version: {Description}",GetDescriptionFromEnumValue(pf.Header.Version));
1088 | Console.WriteLine();
1089 |
1090 | Log.Information("Run count: {RunCount:N0}",pf.RunCount);
1091 |
1092 | var lastRun = pf.LastRunTimes.First();
1093 |
1094 | Log.Information("Last run: {LastRun}",lastRun);
1095 |
1096 | if (pf.LastRunTimes.Count > 1)
1097 | {
1098 | var lastRuns = pf.LastRunTimes.Skip(1).ToList();
1099 |
1100 | var otherRunTimes = string.Join(", ",
1101 | lastRuns.Select(t => t.ToString(ActiveDateTimeFormat)));
1102 |
1103 | Log.Information("Other run times: {OtherRunTimes}",otherRunTimes);
1104 |
1105 | }
1106 |
1107 | Console.WriteLine();
1108 | Log.Information("Volume information:");
1109 | Console.WriteLine();
1110 | var volnum = 0;
1111 |
1112 | foreach (var volumeInfo in pf.VolumeInformation)
1113 | {
1114 | var localCreate = volumeInfo.CreationTime;
1115 |
1116 | Log.Information(
1117 | "#{VolumeNumber}: Name: {DeviceName} Serial: {SerialNumber} Created: {LocalCreate} Directories: {DirectoryNamesCount:N0} File references: {FileReferencesCount:N0}",
1118 | volnum, volumeInfo.DeviceName, volumeInfo.SerialNumber, localCreate,
1119 | volumeInfo.DirectoryNames.Count, volumeInfo.FileReferences.Count);
1120 | volnum += 1;
1121 | }
1122 |
1123 | Console.WriteLine();
1124 |
1125 | var totalDirs = pf.TotalDirectoryCount;
1126 | if (pf.Header.Version == Version.WinXpOrWin2K3)
1127 | {
1128 | totalDirs = 0;
1129 | //this has -1 for total directories, so we have to calculate it
1130 | foreach (var volumeInfo in pf.VolumeInformation)
1131 | {
1132 | totalDirs += volumeInfo.DirectoryNames.Count;
1133 | }
1134 | }
1135 |
1136 | Log.Information("Directories referenced: {TotalDirs:N0}",totalDirs);
1137 | Console.WriteLine();
1138 | var dirIndex = 0;
1139 | foreach (var volumeInfo in pf.VolumeInformation)
1140 | {
1141 | foreach (var directoryName in volumeInfo.DirectoryNames)
1142 | {
1143 | var found = false;
1144 | foreach (var keyword in _keywords)
1145 | {
1146 | if (directoryName.ToLower().Contains(keyword))
1147 | {
1148 | Log.Fatal("{DirIndex:0#}: {DirectoryName} (Keyword {Kw})",dirIndex,directoryName,true);
1149 | found = true;
1150 | break;
1151 | }
1152 | }
1153 |
1154 | if (!found)
1155 | {
1156 | Log.Information("{DirIndex:0#}: {DirectoryName}",dirIndex,directoryName);
1157 | }
1158 |
1159 | dirIndex += 1;
1160 | }
1161 | }
1162 |
1163 | Console.WriteLine();
1164 |
1165 | Log.Information("Files referenced: {FilenamesCount:N0}",pf.Filenames.Count);
1166 | Console.WriteLine();
1167 | var fileIndex = 0;
1168 |
1169 | foreach (var filename in pf.Filenames)
1170 | {
1171 | if (filename.EndsWith(pf.Header.ExecutableFilename))
1172 | {
1173 | Log.Information("{FileIndex:0#}: {Filename} (Executable: {Exe}) ",fileIndex,filename,true);
1174 | }
1175 | else
1176 | {
1177 | var found = false;
1178 | foreach (var keyword in _keywords)
1179 | {
1180 | if (filename.ToLower().Contains(keyword))
1181 | {
1182 | Log.Information("{FileIndex:0#}: {Filename} (Keyword: {Kw})", fileIndex, filename,true);
1183 | found = true;
1184 | break;
1185 | }
1186 | }
1187 |
1188 | if (!found)
1189 | {
1190 | Log.Information("{FileIndex:0#}: {Filename}",fileIndex,filename);
1191 | }
1192 | }
1193 |
1194 | fileIndex += 1;
1195 | }
1196 | }
1197 |
1198 |
1199 | if (q == false)
1200 | {
1201 | Console.WriteLine();
1202 | }
1203 | if (q == false)
1204 | {
1205 | Console.WriteLine();
1206 | }
1207 | }
1208 |
1209 | class DateTimeOffsetFormatter : IFormatProvider, ICustomFormatter
1210 | {
1211 | private readonly IFormatProvider _innerFormatProvider;
1212 |
1213 | public DateTimeOffsetFormatter(IFormatProvider innerFormatProvider)
1214 | {
1215 | _innerFormatProvider = innerFormatProvider;
1216 | }
1217 |
1218 | public object GetFormat(Type formatType)
1219 | {
1220 | return formatType == typeof(ICustomFormatter) ? this : _innerFormatProvider.GetFormat(formatType);
1221 | }
1222 |
1223 | public string Format(string format, object arg, IFormatProvider formatProvider)
1224 | {
1225 | if (arg is DateTimeOffset)
1226 | {
1227 | var size = (DateTimeOffset)arg;
1228 | return size.ToString(ActiveDateTimeFormat);
1229 | }
1230 |
1231 | var formattable = arg as IFormattable;
1232 | if (formattable != null)
1233 | {
1234 | return formattable.ToString(format, _innerFormatProvider);
1235 | }
1236 |
1237 | return arg.ToString();
1238 | }
1239 | }
1240 |
1241 | private static IPrefetch LoadFile(string pfFile, bool q, string dt)
1242 | {
1243 | var pfname = pfFile;
1244 |
1245 | if (pfFile.StartsWith(VssDir))
1246 | {
1247 | pfname = $"VSS{pfFile.Replace($"{VssDir}\\", "")}";
1248 | }
1249 |
1250 | if (q == false)
1251 | {
1252 | Log.Information("Processing {Pfname}",pfname);
1253 | Console.WriteLine();
1254 | }
1255 |
1256 | var sw = new Stopwatch();
1257 | sw.Start();
1258 |
1259 | try
1260 | {
1261 |
1262 | var pf = PrefetchFile.Open(pfFile);
1263 |
1264 | if (pf.ParsingError)
1265 | {
1266 | _failedFiles.Add($"{pfname} is corrupt and did not parse completely!");
1267 | Log.Fatal("{Pfname} FILE DID NOT PARSE COMPLETELY!",pfname);
1268 | Console.WriteLine();
1269 | }
1270 |
1271 | if (q == false)
1272 | {
1273 | DisplayFile(pf, false, ActiveDateTimeFormat);
1274 | }
1275 |
1276 | Log.Information("---------- Processed {PfName} in {TotalSeconds:N8} seconds ----------",pfname,sw.Elapsed.TotalSeconds);
1277 |
1278 | return pf;
1279 | }
1280 | catch (ArgumentNullException an)
1281 | {
1282 | Log.Error("Error opening {Pfname}. This appears to be a Windows 10 prefetch file. You must be running Windows 8 or higher to decompress Windows 10 prefetch files",pfname);
1283 | Console.WriteLine();
1284 | _failedFiles.Add(
1285 | $"{pfname} ==> ({an.Message} (This appears to be a Windows 10 prefetch file. You must be running Windows 8 or higher to decompress Windows 10 prefetch files))");
1286 | }
1287 | catch (Exception ex)
1288 | {
1289 | Log.Error(ex,"Error opening {Pfname}. Message: {Message}",pfname,ex.Message);
1290 | Console.WriteLine();
1291 |
1292 | _failedFiles.Add($"{pfname} ==> ({ex.Message})");
1293 | }
1294 |
1295 | return null;
1296 | }
1297 |
1298 |
1299 | public sealed class CsvOutTl
1300 | {
1301 | public string RunTime { get; set; }
1302 | public string ExecutableName { get; set; }
1303 | }
1304 |
1305 | public sealed class CsvOut
1306 | {
1307 | public string Note { get; set; }
1308 | public string SourceFilename { get; set; }
1309 | public string SourceCreated { get; set; }
1310 | public string SourceModified { get; set; }
1311 | public string SourceAccessed { get; set; }
1312 | public string ExecutableName { get; set; }
1313 | public string Hash { get; set; }
1314 | public string Size { get; set; }
1315 | public string Version { get; set; }
1316 | public string RunCount { get; set; }
1317 |
1318 | public string LastRun { get; set; }
1319 | public string PreviousRun0 { get; set; }
1320 | public string PreviousRun1 { get; set; }
1321 | public string PreviousRun2 { get; set; }
1322 | public string PreviousRun3 { get; set; }
1323 | public string PreviousRun4 { get; set; }
1324 | public string PreviousRun5 { get; set; }
1325 | public string PreviousRun6 { get; set; }
1326 |
1327 | public string Volume0Name { get; set; }
1328 | public string Volume0Serial { get; set; }
1329 | public string Volume0Created { get; set; }
1330 |
1331 | public string Volume1Name { get; set; }
1332 | public string Volume1Serial { get; set; }
1333 | public string Volume1Created { get; set; }
1334 |
1335 | public string Directories { get; set; }
1336 | public string FilesLoaded { get; set; }
1337 | public bool ParsingError { get; set; }
1338 | }
1339 | }
1340 |
1341 |
--------------------------------------------------------------------------------
/PECmd/ExternalFiles.cs:
--------------------------------------------------------------------------------
1 | namespace PECmd;
2 |
3 | public static class ExternalFiles
4 | {
5 | public static readonly string Style = @"LyogUmVwb3J0IHN0eWxpbmcgd3JpdHRlbiBieTogRGV2b24gQWNrZXJtYW4KICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JhZnRlZCBmb3IgUEVDbWQKICAgICAgICAgICAgICAgICAgICAgIGRldm9uQGFlaWZvcmVuc2ljcy5jb20KICAgICAgICAgICAgICAgICAgICBMYXN0IFVwZGF0ZWQ6IDIwMTYuMDMuMDQKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCi8qIElmIHZhbHVlIGlzIGVtcHR5LCB0aGVuIGhpZGUgY29udGFpbmVyICovCjplbXB0eSB7CiAgICBkaXNwbGF5OiBub25lICFpbXBvcnRhbnQ7Cn0KCkNvbnRhaW5lciB7CiAgICBiYWNrZ3JvdW5kLWNvbG9yOiAjRTlGMEY0OwogICAgYm9yZGVyOiBtZWRpdW0gIzE0NkI5OSBzb2xpZDsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgaGVpZ2h0OiBhdXRvOwogICAgbWFyZ2luOiAxMHB4OwogICAgbWluLWhlaWdodDogNTBweDsgLyogbWluLWhlaWdodCAqLwogICAgbWluLXdpZHRoOiA1MHB4OyAvKiBtaW4td2lkdGggICovCiAgICBvdmVyZmxvdzogYXV0bzsKICAgIHBhZGRpbmc6IDA7CiAgICByZXNpemU6IGJvdGg7CiAgICB3aWR0aDogMTQwMHB4Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgLlBGIGJlZm9yZSBhbmQgYWJvdmUgcGF0aCBzdGF0ZW1lbnQKCUNvbnRhaW5lcjpiZWZvcmUgewoJICBkaXNwbGF5OiBibG9jazsKCSAgd2lkdGg6IGF1dG87CgkgIGZvbnQtd2VpZ2h0OiBib2xkOwoJICBmb250LXNpemU6IDI0cHg7CgkgIGNvbnRlbnQ6ICIuUEYgRmlsZSI7CgkgIGJhY2tncm91bmQtY29sb3I6ICMxNDZCOTk7CgkgIGNvbG9yOiAjRjE4QzE0OwoJICBwYWRkaW5nOiAycHggMCAwIDJweDsKCSAgbWFyZ2luOiAwOwoJfQoJKi8KClNvdXJjZUZpbGUgewogICAgYmFja2dyb3VuZC1jb2xvcjogIzE0NkI5OTsKICAgIGNvbG9yOiAjRkZCRDZGOwogICAgZGlzcGxheTogYmxvY2s7CiAgICBmb250LXNpemU6IDE2cHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIG1hcmdpbjogMDsKICAgIHBhZGRpbmc6IDA7CiAgICB3aWR0aDogYXV0bzsKfQoKU291cmNlQ3JlYXRlZCwgU291cmNlTW9kaWZpZWQsIFNvdXJjZUFjY2Vzc2VkLCBMYXN0UnVuLCBQcmV2aW91c1J1bjAsIFByZXZpb3VzUnVuMSwgUHJldmlvdXNSdW4yLCBQcmV2aW91c1J1bjMsIFByZXZpb3VzUnVuNCwgUHJldmlvdXNSdW41LCBQcmV2aW91c1J1bjYsIEV4ZWN1dGFibGVOYW1lLCBSdW5Db3VudCwgU2l6ZSwgSGFzaCwgVmVyc2lvbiwgTm90ZSwgVm9sdW1lME5hbWUsIFZvbHVtZTBTZXJpYWwsIFZvbHVtZTBDcmVhdGVkLCBWb2x1bWUxTmFtZSwgVm9sdW1lMVNlcmlhbCwgVm9sdW1lMUNyZWF0ZWQsIERpcmVjdG9yaWVzLCBGaWxlc0xvYWRlZCB7CiAgICBjb2xvcjogIzA0M0Y1RjsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogbm9ybWFsOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiA0cHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAwIDAgMzRweDsKICAgIHRleHQtYWxpZ246IGxlZnQ7CiAgICB3aWR0aDogYXV0bzsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpTb3VyY2VDcmVhdGVkOmJlZm9yZSB7CiAgICBjb250ZW50OiAiU291cmNlIENyZWF0ZWQ6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDIwcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCi8qIFJlbW92ZSBjb21tZW50IHRhZ3MgdG8gc2hvdyAoVVRDKSBhZnRlciB0aW1lc3RhbXAKCQlTb3VyY2VDcmVhdGVkOmFmdGVyIHsKCQkJY29udGVudDogIiAoVVRDKSI7CgkJCWNvbG9yOiAjQTZBOEE5OwoJCX0KCQkqLwoKU291cmNlQ3JlYXRlZDpob3ZlciB7CiAgICBjb2xvcjogI0E2QThBOTsKICAgIGNvbnRlbnQ6ICIgKFVUQykiOwp9CgpTb3VyY2VNb2RpZmllZDpiZWZvcmUgewogICAgY29udGVudDogIlNvdXJjZSBNb2RpZmllZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTVweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IChVVEMpIGFmdGVyIHRpbWVzdGFtcAoJCVNvdXJjZUNyZWF0ZWQ6YWZ0ZXIgewoJCQljb250ZW50OiAiIChVVEMpIjsKCQkJY29sb3I6ICNBNkE4QTk7CgkJfQoJCSovCgpTb3VyY2VBY2Nlc3NlZDpiZWZvcmUgewogICAgY29udGVudDogIlNvdXJjZSBBY2Nlc3NlZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IChVVEMpIGFmdGVyIHRpbWVzdGFtcAoJCVNvdXJjZUNyZWF0ZWQ6YWZ0ZXIgewoJCQljb250ZW50OiAiIChVVEMpIjsKCQkJY29sb3I6ICNBNkE4QTk7CgkJfQoJCSovCgpMYXN0UnVuOmJlZm9yZSB7CiAgICBjb250ZW50OiAiTGFzdCBSdW46IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDczcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCi8qIFJlbW92ZSBjb21tZW50IHRhZ3MgdG8gc2hvdyAoVVRDKSBhZnRlciB0aW1lc3RhbXAKCQlMYXN0UnVuOmFmdGVyIHsKCQkJY29udGVudDogIiAoVVRDKSI7CgkJCWNvbG9yOiAjQTZBOEE5OwoJCX0KCQkqLwoKUHJldmlvdXNSdW4wOmJlZm9yZSB7CiAgICBjb250ZW50OiAiUHJldmlvdXMgUnVuIDA6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDE4cHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KClByZXZpb3VzUnVuMTpiZWZvcmUgewogICAgY29udGVudDogIlByZXZpb3VzIFJ1biAxOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxOHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpQcmV2aW91c1J1bjI6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJQcmV2aW91cyBSdW4gMjoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMThweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKUHJldmlvdXNSdW4zOmJlZm9yZSB7CiAgICBjb250ZW50OiAiUHJldmlvdXMgUnVuIDM6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDE4cHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KClByZXZpb3VzUnVuNDpiZWZvcmUgewogICAgY29udGVudDogIlByZXZpb3VzIFJ1biA0OiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxOHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpQcmV2aW91c1J1bjU6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJQcmV2aW91cyBSdW4gNToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMThweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKUHJldmlvdXNSdW42OmJlZm9yZSB7CiAgICBjb250ZW50OiAiUHJldmlvdXMgUnVuIDY6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDE4cHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCkV4ZWN1dGFibGVOYW1lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiRXhlY3V0YWJsZSBOYW1lOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlSdW5Db3VudDphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIHRyYWNrZWQgYnkgdGhlIHBmIGZpbGUiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClJ1bkNvdW50OmJlZm9yZSB7CiAgICBjb250ZW50OiAiUnVuIENvdW50OiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpTaXplOmJlZm9yZSB7CiAgICBjb250ZW50OiAiU2l6ZToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCgkJU2l6ZTphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IHNpemUgaW4gYnl0ZXMgb2YgZXhlY3V0YWJsZSkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KCkhhc2g6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJIYXNoOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlIYXNoOmFmdGVyIHsKCQkJY29udGVudDogIiAoTm90ZTogVGhlIGNhbGN1bGF0ZWQgaGFzaCBmb3IgdGhlIHBmIGZpbGUgdGhhdCBzaG91bGQgbWF0Y2ggdGhlIGhhc2ggaW4gdGhlIHNvdXJjZSBmaWxlIG5hbWUpIjsKCQkJY29sb3I6ICNBNkE4QTk7CgkJfQoJCSovCgpWZXJzaW9uOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVmVyc2lvbjoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCgkJVmVyc2lvbjphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFRoZSBvcGVyYXRpbmcgc3lzdGVtIHRoYXQgZ2VuZXJhdGVkIHRoZSBwcmVmZXRjaCBmaWxlKSI7CgkJCWNvbG9yOiAjQTZBOEE5OwoJCX0KCQkqLwoKTm90ZTpiZWZvcmUgewogICAgY29udGVudDogIk5vdGU6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDEwcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KCk5vdGU6YWZ0ZXIgewogICAgY29sb3I6ICNBNkE4QTk7CiAgICBjb250ZW50OiAiIChOb3RlOiBQb3B1bGF0ZWQgd2hlbiA+MiB2b2x1bWVzIGFyZSBpZGVudGlmaWVkIGluIGEgcHJlZmV0Y2ggZmlsZS4gVGhpcyBpcyByYXJlLikiOwp9CgpWb2x1bWUwTmFtZSB7CiAgICBjb2xvcjogbWFyb29uOwp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlWb2x1bWUwTmFtZTphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFRoZSBmaXJzdCB2b2x1bWUgbmFtZSBmb3VuZCkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClZvbHVtZTBOYW1lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVm9sdW1lIDAgTmFtZToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKVm9sdW1lMFNlcmlhbCB7CiAgICBjb2xvcjogbWFyb29uOwp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlWb2x1bWUwU2VyaWFsOmFmdGVyIHsKCQkJY29udGVudDogIiAoTm90ZTogU2VyaWFsICMgb2YgdGhlIGZpcnN0IHZvbHVtZSkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClZvbHVtZTBTZXJpYWw6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJWb2x1bWUgMCBTZXJpYWw6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbGluZS1oZWlnaHQ6IDE7CiAgICBtYXJnaW46IDJweCAwIDRweCAwOwogICAgcGFkZGluZzogMnB4IDEwcHggMCAycHg7CiAgICB0ZXh0LWFsaWduOiByaWdodDsKICAgIHRleHQtZGVjb3JhdGlvbjogdW5kZXJsaW5lOwogICAgd29yZC1zcGFjaW5nOiAycHQ7Cn0KClZvbHVtZTBDcmVhdGVkIHsKICAgIGNvbG9yOiBtYXJvb247Cn0KClZvbHVtZTBDcmVhdGVkOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVm9sdW1lIDAgQ3JlYXRlZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggNHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgovKiBSZW1vdmUgY29tbWVudCB0YWdzIHRvIHNob3cgYSBub3RlIG9uIHJlcG9ydCB0aGF0IG1hdGNoZXMgaG92ZXIgdG9vbCB0aXAKCQlWb2x1bWUwQ3JlYXRlZDphZnRlciB7CgkJCWNvbnRlbnQ6ICIgKE5vdGU6IFZvbHVtZSBjcmVhdGVkIHRpbWVzdGFtcCkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KClZvbHVtZTFOYW1lOmJlZm9yZSB7CiAgICBjb250ZW50OiAiVm9sdW1lIDEgTmFtZToiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKVm9sdW1lMVNlcmlhbDpiZWZvcmUgewogICAgY29udGVudDogIlZvbHVtZSAxIFNlcmlhbDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKVm9sdW1lMUNyZWF0ZWQ6YmVmb3JlIHsKICAgIGNvbnRlbnQ6ICJWb2x1bWUgMSBDcmVhdGVkOiI7CiAgICBkaXNwbGF5OiBpbmxpbmU7CiAgICBmb250LWZhbWlseTogdmVyZGFuYSwgc2Fucy1zZXJpZjsKICAgIGZvbnQtc2l6ZTogMTJweDsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwogICAgbGV0dGVyLXNwYWNpbmc6IDFwdDsKICAgIGxpbmUtaGVpZ2h0OiAxOwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxOHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKICAgIHdvcmQtc3BhY2luZzogMnB0Owp9CgpkaXYgewogICAgLW1vei1jb2x1bW4tY291bnQ6IDM7IC8qIEZpcmVmb3ggKi8KICAgIC13ZWJraXQtY29sdW1uLWNvdW50OiAzOyAvKiBDaHJvbWUsIFNhZmFyaSwgT3BlcmEgKi8KICAgIGNvbHVtbi1jb3VudDogMzsKfQoKRGlyZWN0b3JpZXMgewogICAgYmFja2dyb3VuZC1pbWFnZTogdXJsKGRpcmVjdG9yaWVzLnBuZyk7CiAgICBiYWNrZ3JvdW5kLXBvc2l0aW9uOiBsZWZ0IHRvcDsKICAgIGJhY2tncm91bmQtcmVwZWF0OiBuby1yZXBlYXQ7CiAgICBiYWNrZ3JvdW5kLXNpemU6IDMwcHggNDRweDsKICAgIGxpbmUtaGVpZ2h0OiAxLjQ7Cn0KCkRpcmVjdG9yaWVzOmJlZm9yZSB7CiAgICBjb250ZW50OiAiRGlyZWN0b3JpZXM6IjsKICAgIGRpc3BsYXk6IGlubGluZTsKICAgIGZvbnQtZmFtaWx5OiB2ZXJkYW5hLCBzYW5zLXNlcmlmOwogICAgZm9udC1zaXplOiAxMnB4OwogICAgZm9udC13ZWlnaHQ6IGJvbGQ7CiAgICBsZXR0ZXItc3BhY2luZzogMXB0OwogICAgbWFyZ2luOiAycHggMCA0cHggMDsKICAgIHBhZGRpbmc6IDJweCAxMHB4IDAgMnB4OwogICAgdGV4dC1hbGlnbjogcmlnaHQ7CiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCgkJRGlyZWN0b3JpZXM6YWZ0ZXIgewoJCQljb250ZW50OiAiIChOb3RlOiBBIGNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIGFsbCBkaXJlY3RvcmllcyBhY2Nlc3NlZCBieSB0aGUgZXhlY3V0YWJsZSkiOwoJCQljb2xvcjogI0E2QThBOTsKCQl9CgkJKi8KCkZpbGVzTG9hZGVkIHsKICAgIGJhY2tncm91bmQtaW1hZ2U6IHVybChmaWxlc2xvYWRlZC5wbmcpOwogICAgYmFja2dyb3VuZC1wb3NpdGlvbjogbGVmdCB0b3A7CiAgICBiYWNrZ3JvdW5kLXJlcGVhdDogbm8tcmVwZWF0OwogICAgYmFja2dyb3VuZC1zaXplOiAzMHB4IDQ0cHg7CiAgICBsaW5lLWhlaWdodDogMS40Owp9CgpGaWxlc0xvYWRlZDpiZWZvcmUgewogICAgY29udGVudDogIkZpbGVzIExvYWRlZDoiOwogICAgZGlzcGxheTogaW5saW5lOwogICAgZm9udC1mYW1pbHk6IHZlcmRhbmEsIHNhbnMtc2VyaWY7CiAgICBmb250LXNpemU6IDEycHg7CiAgICBmb250LXdlaWdodDogYm9sZDsKICAgIGxldHRlci1zcGFjaW5nOiAxcHQ7CiAgICBsaW5lLWhlaWdodDogMTsKICAgIG1hcmdpbjogMnB4IDAgNHB4IDA7CiAgICBwYWRkaW5nOiAycHggMTBweCAwIDJweDsKICAgIHRleHQtYWxpZ246IHJpZ2h0OwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmU7CiAgICB3b3JkLXNwYWNpbmc6IDJwdDsKfQoKLyogUmVtb3ZlIGNvbW1lbnQgdGFncyB0byBzaG93IGEgbm90ZSBvbiByZXBvcnQgdGhhdCBtYXRjaGVzIGhvdmVyIHRvb2wgdGlwCkZpbGVzTG9hZGVkOmFmdGVyIHsKICAgIGNvbnRlbnQ6ICIgKE5vdGU6IEEgY29tbWEgc2VwYXJhdGVkIGxpc3Qgb2YgYWxsIGZpbGVzIHRoYXQgd2VyZSBsb2FkZWQgYnkgdGhlIGV4ZWN1dGFibGUpIjsKICAgIGNvbG9yOiAjQTZBOEE5Owp9Ciov";
6 | public static readonly string Normalize = @"LyohIG5vcm1hbGl6ZS5jc3MgdjMuMC4zIHwgTUlUIExpY2Vuc2UgfCBnaXRodWIuY29tL25lY29sYXMvbm9ybWFsaXplLmNzcyAqLwoKLyoqCiAqIDEuIFNldCBkZWZhdWx0IGZvbnQgZmFtaWx5IHRvIHNhbnMtc2VyaWYuCiAqIDIuIFByZXZlbnQgaU9TIGFuZCBJRSB0ZXh0IHNpemUgYWRqdXN0IGFmdGVyIGRldmljZSBvcmllbnRhdGlvbiBjaGFuZ2UsCiAqICAgIHdpdGhvdXQgZGlzYWJsaW5nIHVzZXIgem9vbS4KICovCgpodG1sIHsKICAgIC1tcy10ZXh0LXNpemUtYWRqdXN0OiAxMDAlOyAvKiAyICovCiAgICAtd2Via2l0LXRleHQtc2l6ZS1hZGp1c3Q6IDEwMCU7IC8qIDIgKi8KICAgIGZvbnQtZmFtaWx5OiBzYW5zLXNlcmlmOyAvKiAxICovCn0KCi8qKgogKiBSZW1vdmUgZGVmYXVsdCBtYXJnaW4uCiAqLwoKYm9keSB7CiAgICBtYXJnaW46IDA7Cn0KCi8qIEhUTUw1IGRpc3BsYXkgZGVmaW5pdGlvbnMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKgogKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYW55IEhUTUw1IGVsZW1lbnQgaW4gSUUgOC85LgogKiBDb3JyZWN0IGBibG9ja2AgZGlzcGxheSBub3QgZGVmaW5lZCBmb3IgYGRldGFpbHNgIG9yIGBzdW1tYXJ5YCBpbiBJRSAxMC8xMQogKiBhbmQgRmlyZWZveC4KICogQ29ycmVjdCBgYmxvY2tgIGRpc3BsYXkgbm90IGRlZmluZWQgZm9yIGBtYWluYCBpbiBJRSAxMS4KICovCgphcnRpY2xlLAphc2lkZSwKZGV0YWlscywKZmlnY2FwdGlvbiwKZmlndXJlLApmb290ZXIsCmhlYWRlciwKbWFpbiwKbWVudSwKbmF2LApzZWN0aW9uLApzdW1tYXJ5IHsKICAgIGRpc3BsYXk6IGJsb2NrOwp9CgovKioKICogMS4gQ29ycmVjdCBgaW5saW5lLWJsb2NrYCBkaXNwbGF5IG5vdCBkZWZpbmVkIGluIElFIDgvOS4KICogMi4gTm9ybWFsaXplIHZlcnRpY2FsIGFsaWdubWVudCBvZiBgcHJvZ3Jlc3NgIGluIENocm9tZSwgRmlyZWZveCwgYW5kIE9wZXJhLgogKi8KCmF1ZGlvLApjYW52YXMsCnByb2dyZXNzLAp2aWRlbyB7CiAgICBkaXNwbGF5OiBpbmxpbmUtYmxvY2s7IC8qIDEgKi8KICAgIHZlcnRpY2FsLWFsaWduOiBiYXNlbGluZTsgLyogMiAqLwp9CgovKioKICogUHJldmVudCBtb2Rlcm4gYnJvd3NlcnMgZnJvbSBkaXNwbGF5aW5nIGBhdWRpb2Agd2l0aG91dCBjb250cm9scy4KICogUmVtb3ZlIGV4Y2VzcyBoZWlnaHQgaW4gaU9TIDUgZGV2aWNlcy4KICovCgphdWRpbzpub3QoW2NvbnRyb2xzXSkgewogICAgZGlzcGxheTogbm9uZTsKICAgIGhlaWdodDogMDsKfQoKLyoqCiAqIEFkZHJlc3MgYFtoaWRkZW5dYCBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS8xMC4KICogSGlkZSB0aGUgYHRlbXBsYXRlYCBlbGVtZW50IGluIElFIDgvOS8xMC8xMSwgU2FmYXJpLCBhbmQgRmlyZWZveCA8IDIyLgogKi8KCltoaWRkZW5dLAp0ZW1wbGF0ZSB7CiAgICBkaXNwbGF5OiBub25lOwp9CgovKiBMaW5rcwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyoqCiAqIFJlbW92ZSB0aGUgZ3JheSBiYWNrZ3JvdW5kIGNvbG9yIGZyb20gYWN0aXZlIGxpbmtzIGluIElFIDEwLgogKi8KCmEgewogICAgYmFja2dyb3VuZC1jb2xvcjogdHJhbnNwYXJlbnQ7Cn0KCi8qKgogKiBJbXByb3ZlIHJlYWRhYmlsaXR5IG9mIGZvY3VzZWQgZWxlbWVudHMgd2hlbiB0aGV5IGFyZSBhbHNvIGluIGFuCiAqIGFjdGl2ZS9ob3ZlciBzdGF0ZS4KICovCgphOmFjdGl2ZSwKYTpob3ZlciB7CiAgICBvdXRsaW5lOiAwOwp9CgovKiBUZXh0LWxldmVsIHNlbWFudGljcwogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyoqCiAqIEFkZHJlc3MgaW5jb25zaXN0ZW50IHN0eWxpbmcgb2YgYGFiYnJbdGl0bGVdYC4KICogMS4gQ29ycmVjdCBzdHlsaW5nIGluIEZpcmVmb3ggMzkgYW5kIE9wZXJhIDEyLgogKiAyLiBDb3JyZWN0IG1pc3Npbmcgc3R5bGluZyBpbiBDaHJvbWUsIEVkZ2UsIElFLCBPcGVyYSwgYW5kIFNhZmFyaS4KICovCgphYmJyW3RpdGxlXSB7CiAgICBib3JkZXItYm90dG9tOiBub25lOyAvKiAxICovCiAgICB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgLyogMiAqLwogICAgdGV4dC1kZWNvcmF0aW9uOiB1bmRlcmxpbmUgZG90dGVkOyAvKiAyICovCn0KCi8qKgogKiBBZGRyZXNzIGluY29uc2lzdGVudCBzdHlsaW5nIG9mIGIgYW5kIHN0cm9uZy4KICogMS4gQ29ycmVjdCBkdXBsaWNhdGUgYXBwbGljYXRpb24gb2YgYGJvbGRlcmAgaW4gU2FmYXJpIDYuMC4yLgogKiAyLiBDb3JyZWN0IHN0eWxlIHNldCB0byBgYm9sZGAgaW4gRWRnZSAxMissIFNhZmFyaSA2LjIrLCBhbmQgQ2hyb21lIDE4Ky4KICovCgpiLApzdHJvbmcgewogICAgZm9udC13ZWlnaHQ6IGluaGVyaXQ7IC8qIDEgKi8KfQoKYiwKc3Ryb25nIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkZXI7IC8qIDIgKi8KfQoKLyoqCiAqIEFkZHJlc3Mgc3R5bGluZyBub3QgcHJlc2VudCBpbiBTYWZhcmkgYW5kIENocm9tZS4KICovCgpkZm4gewogICAgZm9udC1zdHlsZTogaXRhbGljOwp9CgovKioKICogQWRkcmVzcyB2YXJpYWJsZSBgaDFgIGZvbnQtc2l6ZSBhbmQgbWFyZ2luIHdpdGhpbiBgc2VjdGlvbmAgYW5kIGBhcnRpY2xlYAogKiBjb250ZXh0cyBpbiBGaXJlZm94IDQrLCBTYWZhcmksIGFuZCBDaHJvbWUuCiAqLwoKaDEgewogICAgZm9udC1zaXplOiAyZW07CiAgICBtYXJnaW46IDAuNjdlbSAwOwp9CgovKioKICogQWRkcmVzcyBzdHlsaW5nIG5vdCBwcmVzZW50IGluIElFIDgvOS4KICovCgptYXJrIHsKICAgIGJhY2tncm91bmQtY29sb3I6ICNmZjA7CiAgICBjb2xvcjogIzAwMDsKfQoKLyoqCiAqIEFkZHJlc3MgaW5jb25zaXN0ZW50IGFuZCB2YXJpYWJsZSBmb250IHNpemUgaW4gYWxsIGJyb3dzZXJzLgogKi8KCnNtYWxsIHsKICAgIGZvbnQtc2l6ZTogODAlOwp9CgovKioKICogUHJldmVudCBgc3ViYCBhbmQgYHN1cGAgYWZmZWN0aW5nIGBsaW5lLWhlaWdodGAgaW4gYWxsIGJyb3dzZXJzLgogKi8KCnN1YiwKc3VwIHsKICAgIGZvbnQtc2l6ZTogNzUlOwogICAgbGluZS1oZWlnaHQ6IDA7CiAgICBwb3NpdGlvbjogcmVsYXRpdmU7CiAgICB2ZXJ0aWNhbC1hbGlnbjogYmFzZWxpbmU7Cn0KCnN1cCB7CiAgICB0b3A6IC0wLjVlbTsKfQoKc3ViIHsKICAgIGJvdHRvbTogLTAuMjVlbTsKfQoKLyogRW1iZWRkZWQgY29udGVudAogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLwoKLyoqCiAqIFJlbW92ZSBib3JkZXIgd2hlbiBpbnNpZGUgYGFgIGVsZW1lbnQgaW4gSUUgOC85LzEwLgogKi8KCmltZyB7CiAgICBib3JkZXI6IDA7Cn0KCi8qKgogKiBDb3JyZWN0IG92ZXJmbG93IG5vdCBoaWRkZW4gaW4gSUUgOS8xMC8xMS4KICovCgpzdmc6bm90KDpyb290KSB7CiAgICBvdmVyZmxvdzogaGlkZGVuOwp9CgovKiBHcm91cGluZyBjb250ZW50CiAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCgovKioKICogQWRkcmVzcyBtYXJnaW4gbm90IHByZXNlbnQgaW4gSUUgOC85IGFuZCBTYWZhcmkuCiAqLwoKZmlndXJlIHsKICAgIG1hcmdpbjogMWVtIDQwcHg7Cn0KCi8qKgogKiBBZGRyZXNzIGluY29uc2lzdGVudCBzdHlsaW5nIG9mIGBocmAuCiAqIDEuIENvcnJlY3QgYGJveC1zaXppbmdgIHNldCB0byBgYm9yZGVyLWJveGAgaW4gRmlyZWZveC4KICogMi4gQ29ycmVjdCBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEgYW5kIEVkZ2UgMTIuCiAqLwoKaHIgewogICAgYm94LXNpemluZzogY29udGVudC1ib3g7IC8qIDEgKi8KICAgIGhlaWdodDogMDsgLyogMSAqLwogICAgb3ZlcmZsb3c6IHZpc2libGU7IC8qIDIgKi8KfQoKLyoqCiAqIENvbnRhaW4gb3ZlcmZsb3cgaW4gYWxsIGJyb3dzZXJzLgogKi8KCnByZSB7CiAgICBvdmVyZmxvdzogYXV0bzsKfQoKLyoqCiAqIDEuIENvcnJlY3QgaW5oZXJpdGFuY2UgYW5kIHNjYWxpbmcgb2YgZm9udC1zaXplIGZvciBwcmVmb3JtYXR0ZWQgdGV4dC4KICogMi4gQWRkcmVzcyBvZGQgYGVtYC11bml0IGZvbnQgc2l6ZSByZW5kZXJpbmcgaW4gYWxsIGJyb3dzZXJzLgogKi8KCmNvZGUsCmtiZCwKcHJlLApzYW1wIHsKICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2UsIG1vbm9zcGFjZTsgLyogMSAqLwogICAgZm9udC1zaXplOiAxZW07IC8qIDIgKi8KfQoKLyogRm9ybXMKICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gKi8KCi8qKgogKiBLbm93biBsaW1pdGF0aW9uOiBieSBkZWZhdWx0LCBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYIGFsbG93IHZlcnkgbGltaXRlZAogKiBzdHlsaW5nIG9mIGBzZWxlY3RgLCB1bmxlc3MgYSBgYm9yZGVyYCBwcm9wZXJ0eSBpcyBzZXQuCiAqLwoKLyoqCiAqIDEuIENvcnJlY3QgZm9udCBwcm9wZXJ0aWVzIG5vdCBiZWluZyBpbmhlcml0ZWQuCiAqIDIuIEFkZHJlc3MgbWFyZ2lucyBzZXQgZGlmZmVyZW50bHkgaW4gRmlyZWZveCA0KywgU2FmYXJpLCBhbmQgQ2hyb21lLgogKi8KCmJ1dHRvbiwKaW5wdXQsCm9wdGdyb3VwLApzZWxlY3QsCnRleHRhcmVhIHsKICAgIGZvbnQ6IGluaGVyaXQ7IC8qIDEgKi8KICAgIG1hcmdpbjogMDsgLyogMiAqLwp9CgovKioKICogQWRkcmVzcyBgb3ZlcmZsb3dgIHNldCB0byBgaGlkZGVuYCBpbiBJRSA4LzkvMTAvMTEuCiAqLwoKYnV0dG9uIHsKICAgIG92ZXJmbG93OiB2aXNpYmxlOwp9CgovKioKICogQWRkcmVzcyBpbmNvbnNpc3RlbnQgYHRleHQtdHJhbnNmb3JtYCBpbmhlcml0YW5jZSBmb3IgYGJ1dHRvbmAgYW5kIGBzZWxlY3RgLgogKiBBbGwgb3RoZXIgZm9ybSBjb250cm9sIGVsZW1lbnRzIGRvIG5vdCBpbmhlcml0IGB0ZXh0LXRyYW5zZm9ybWAgdmFsdWVzLgogKiBDb3JyZWN0IGBidXR0b25gIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3gsIElFIDgvOS8xMC8xMSwgYW5kIE9wZXJhLgogKiBDb3JyZWN0IGBzZWxlY3RgIHN0eWxlIGluaGVyaXRhbmNlIGluIEZpcmVmb3guCiAqLwoKYnV0dG9uLApzZWxlY3QgewogICAgdGV4dC10cmFuc2Zvcm06IG5vbmU7Cn0KCi8qKgogKiAxLiBBdm9pZCB0aGUgV2ViS2l0IGJ1ZyBpbiBBbmRyb2lkIDQuMC4qIHdoZXJlICgyKSBkZXN0cm95cyBuYXRpdmUgYGF1ZGlvYAogKiAgICBhbmQgYHZpZGVvYCBjb250cm9scy4KICogMi4gQ29ycmVjdCBpbmFiaWxpdHkgdG8gc3R5bGUgY2xpY2thYmxlIGBpbnB1dGAgdHlwZXMgaW4gaU9TLgogKiAzLiBJbXByb3ZlIHVzYWJpbGl0eSBhbmQgY29uc2lzdGVuY3kgb2YgY3Vyc29yIHN0eWxlIGJldHdlZW4gaW1hZ2UtdHlwZQogKiAgICBgaW5wdXRgIGFuZCBvdGhlcnMuCiAqLwoKYnV0dG9uLApodG1sIGlucHV0W3R5cGU9ImJ1dHRvbiJdLCAvKiAxICovCmlucHV0W3R5cGU9InJlc2V0Il0sCmlucHV0W3R5cGU9InN1Ym1pdCJdIHsKICAgIC13ZWJraXQtYXBwZWFyYW5jZTogYnV0dG9uOyAvKiAyICovCiAgICBjdXJzb3I6IHBvaW50ZXI7IC8qIDMgKi8KfQoKLyoqCiAqIFJlLXNldCBkZWZhdWx0IGN1cnNvciBmb3IgZGlzYWJsZWQgZWxlbWVudHMuCiAqLwoKYnV0dG9uW2Rpc2FibGVkXSwKaHRtbCBpbnB1dFtkaXNhYmxlZF0gewogICAgY3Vyc29yOiBkZWZhdWx0Owp9CgovKioKICogUmVtb3ZlIGlubmVyIHBhZGRpbmcgYW5kIGJvcmRlciBpbiBGaXJlZm94IDQrLgogKi8KCmJ1dHRvbjo6LW1vei1mb2N1cy1pbm5lciwKaW5wdXQ6Oi1tb3otZm9jdXMtaW5uZXIgewogICAgYm9yZGVyOiAwOwogICAgcGFkZGluZzogMDsKfQoKLyoqCiAqIFJlc3RvcmUgZm9jdXMgc3R5bGUgaW4gRmlyZWZveCA0KyAodW5zZXQgYnkgYSBydWxlIGFib3ZlKQogKi8KCmJ1dHRvbjotbW96LWZvY3VzcmluZywKaW5wdXQ6LW1vei1mb2N1c3JpbmcgewogICAgb3V0bGluZTogMXB4IGRvdHRlZCBCdXR0b25UZXh0Owp9CgovKioKICogQWRkcmVzcyBGaXJlZm94IDQrIHNldHRpbmcgYGxpbmUtaGVpZ2h0YCBvbiBgaW5wdXRgIHVzaW5nIGAhaW1wb3J0YW50YCBpbgogKiB0aGUgVUEgc3R5bGVzaGVldC4KICovCgppbnB1dCB7CiAgICBsaW5lLWhlaWdodDogbm9ybWFsOwp9CgovKioKICogSXQncyByZWNvbW1lbmRlZCB0aGF0IHlvdSBkb24ndCBhdHRlbXB0IHRvIHN0eWxlIHRoZXNlIGVsZW1lbnRzLgogKiBGaXJlZm94J3MgaW1wbGVtZW50YXRpb24gZG9lc24ndCByZXNwZWN0IGJveC1zaXppbmcsIHBhZGRpbmcsIG9yIHdpZHRoLgogKgogKiAxLiBBZGRyZXNzIGJveCBzaXppbmcgc2V0IHRvIGBjb250ZW50LWJveGAgaW4gSUUgOC85LzEwLgogKiAyLiBSZW1vdmUgZXhjZXNzIHBhZGRpbmcgaW4gSUUgOC85LzEwLgogKi8KCmlucHV0W3R5cGU9ImNoZWNrYm94Il0sCmlucHV0W3R5cGU9InJhZGlvIl0gewogICAgYm94LXNpemluZzogYm9yZGVyLWJveDsgLyogMSAqLwogICAgcGFkZGluZzogMDsgLyogMiAqLwp9CgovKioKICogRml4IHRoZSBjdXJzb3Igc3R5bGUgZm9yIENocm9tZSdzIGluY3JlbWVudC9kZWNyZW1lbnQgYnV0dG9ucy4gRm9yIGNlcnRhaW4KICogYGZvbnQtc2l6ZWAgdmFsdWVzIG9mIHRoZSBgaW5wdXRgLCBpdCBjYXVzZXMgdGhlIGN1cnNvciBzdHlsZSBvZiB0aGUKICogZGVjcmVtZW50IGJ1dHRvbiB0byBjaGFuZ2UgZnJvbSBgZGVmYXVsdGAgdG8gYHRleHRgLgogKi8KCmlucHV0W3R5cGU9Im51bWJlciJdOjotd2Via2l0LWlubmVyLXNwaW4tYnV0dG9uLAppbnB1dFt0eXBlPSJudW1iZXIiXTo6LXdlYmtpdC1vdXRlci1zcGluLWJ1dHRvbiB7CiAgICBoZWlnaHQ6IGF1dG87Cn0KCi8qKgogKiBBZGRyZXNzIGBhcHBlYXJhbmNlYCBzZXQgdG8gYHNlYXJjaGZpZWxkYCBpbiBTYWZhcmkgYW5kIENocm9tZS4KICovCgppbnB1dFt0eXBlPSJzZWFyY2giXSB7CiAgICAtd2Via2l0LWFwcGVhcmFuY2U6IHRleHRmaWVsZDsKfQoKLyoqCiAqIFJlbW92ZSBpbm5lciBwYWRkaW5nIGFuZCBzZWFyY2ggY2FuY2VsIGJ1dHRvbiBpbiBTYWZhcmkgYW5kIENocm9tZSBvbiBPUyBYLgogKiBTYWZhcmkgKGJ1dCBub3QgQ2hyb21lKSBjbGlwcyB0aGUgY2FuY2VsIGJ1dHRvbiB3aGVuIHRoZSBzZWFyY2ggaW5wdXQgaGFzCiAqIHBhZGRpbmcgKGFuZCBgdGV4dGZpZWxkYCBhcHBlYXJhbmNlKS4KICovCgppbnB1dFt0eXBlPSJzZWFyY2giXTo6LXdlYmtpdC1zZWFyY2gtY2FuY2VsLWJ1dHRvbiwKaW5wdXRbdHlwZT0ic2VhcmNoIl06Oi13ZWJraXQtc2VhcmNoLWRlY29yYXRpb24gewogICAgLXdlYmtpdC1hcHBlYXJhbmNlOiBub25lOwp9CgovKioKICogRGVmaW5lIGNvbnNpc3RlbnQgYm9yZGVyLCBtYXJnaW4sIGFuZCBwYWRkaW5nLgogKi8KCmZpZWxkc2V0IHsKICAgIGJvcmRlcjogMXB4IHNvbGlkICNjMGMwYzA7CiAgICBtYXJnaW46IDAgMnB4OwogICAgcGFkZGluZzogMC4zNWVtIDAuNjI1ZW0gMC43NWVtOwp9CgovKioKICogMS4gQ29ycmVjdCBgY29sb3JgIG5vdCBiZWluZyBpbmhlcml0ZWQgaW4gSUUgOC85LzEwLzExLgogKiAyLiBSZW1vdmUgcGFkZGluZyBzbyBwZW9wbGUgYXJlbid0IGNhdWdodCBvdXQgaWYgdGhleSB6ZXJvIG91dCBmaWVsZHNldHMuCiAqLwoKbGVnZW5kIHsKICAgIGJvcmRlcjogMDsgLyogMSAqLwogICAgcGFkZGluZzogMDsgLyogMiAqLwp9CgovKioKICogUmVtb3ZlIGRlZmF1bHQgdmVydGljYWwgc2Nyb2xsYmFyIGluIElFIDgvOS8xMC8xMS4KICovCgp0ZXh0YXJlYSB7CiAgICBvdmVyZmxvdzogYXV0bzsKfQoKLyoqCiAqIFJlc3RvcmUgZm9udCB3ZWlnaHQgKHVuc2V0IGJ5IGEgcnVsZSBhYm92ZSkuCiAqIE5PVEU6IHRoZSBkZWZhdWx0IGNhbm5vdCBzYWZlbHkgYmUgY2hhbmdlZCBpbiBDaHJvbWUgYW5kIFNhZmFyaSBvbiBPUyBYLgogKi8KCm9wdGdyb3VwIHsKICAgIGZvbnQtd2VpZ2h0OiBib2xkOwp9";
7 | public static readonly string Directories = @"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";
8 | public static readonly string FilesLoaded = @"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";
9 | }
--------------------------------------------------------------------------------