cpuid-1.1/000077500000000000000000000000001313655072600124675ustar00rootroot00000000000000cpuid-1.1/.gitignore000066400000000000000000000004121313655072600144540ustar00rootroot00000000000000# Compiled Object files, Static and Dynamic libs (Shared Objects) *.o *.a *.so # Folders _obj _test # Architecture specific extensions/prefixes *.[568vq] [568vq].out *.cgo1.go *.cgo2.c _cgo_defun.c _cgo_gotypes.go _cgo_export.* _testmain.go *.exe *.test *.prof cpuid-1.1/.travis.yml000066400000000000000000000004171313655072600146020ustar00rootroot00000000000000language: go sudo: false os: - linux - osx go: - 1.5.x - 1.6.x - 1.7.x - 1.8.x - master script: - go vet ./... - go test -v ./... - go test -race ./... - diff <(gofmt -d .) <("") matrix: allow_failures: - go: 'master' fast_finish: true cpuid-1.1/LICENSE000066400000000000000000000020661313655072600135000ustar00rootroot00000000000000The MIT License (MIT) Copyright (c) 2015 Klaus Post Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. cpuid-1.1/README.md000066400000000000000000000116551313655072600137560ustar00rootroot00000000000000# cpuid Package cpuid provides information about the CPU running the current program. CPU features are detected on startup, and kept for fast access through the life of the application. Currently x86 / x64 (AMD64) is supported, and no external C (cgo) code is used, which should make the library very easy to use. You can access the CPU information by accessing the shared CPU variable of the cpuid library. Package home: https://github.com/klauspost/cpuid [![GoDoc][1]][2] [![Build Status][3]][4] [1]: https://godoc.org/github.com/klauspost/cpuid?status.svg [2]: https://godoc.org/github.com/klauspost/cpuid [3]: https://travis-ci.org/klauspost/cpuid.svg [4]: https://travis-ci.org/klauspost/cpuid # features ## CPU Instructions * **CMOV** (i686 CMOV) * **NX** (NX (No-Execute) bit) * **AMD3DNOW** (AMD 3DNOW) * **AMD3DNOWEXT** (AMD 3DNowExt) * **MMX** (standard MMX) * **MMXEXT** (SSE integer functions or AMD MMX ext) * **SSE** (SSE functions) * **SSE2** (P4 SSE functions) * **SSE3** (Prescott SSE3 functions) * **SSSE3** (Conroe SSSE3 functions) * **SSE4** (Penryn SSE4.1 functions) * **SSE4A** (AMD Barcelona microarchitecture SSE4a instructions) * **SSE42** (Nehalem SSE4.2 functions) * **AVX** (AVX functions) * **AVX2** (AVX2 functions) * **FMA3** (Intel FMA 3) * **FMA4** (Bulldozer FMA4 functions) * **XOP** (Bulldozer XOP functions) * **F16C** (Half-precision floating-point conversion) * **BMI1** (Bit Manipulation Instruction Set 1) * **BMI2** (Bit Manipulation Instruction Set 2) * **TBM** (AMD Trailing Bit Manipulation) * **LZCNT** (LZCNT instruction) * **POPCNT** (POPCNT instruction) * **AESNI** (Advanced Encryption Standard New Instructions) * **CLMUL** (Carry-less Multiplication) * **HTT** (Hyperthreading (enabled)) * **HLE** (Hardware Lock Elision) * **RTM** (Restricted Transactional Memory) * **RDRAND** (RDRAND instruction is available) * **RDSEED** (RDSEED instruction is available) * **ADX** (Intel ADX (Multi-Precision Add-Carry Instruction Extensions)) * **SHA** (Intel SHA Extensions) * **AVX512F** (AVX-512 Foundation) * **AVX512DQ** (AVX-512 Doubleword and Quadword Instructions) * **AVX512IFMA** (AVX-512 Integer Fused Multiply-Add Instructions) * **AVX512PF** (AVX-512 Prefetch Instructions) * **AVX512ER** (AVX-512 Exponential and Reciprocal Instructions) * **AVX512CD** (AVX-512 Conflict Detection Instructions) * **AVX512BW** (AVX-512 Byte and Word Instructions) * **AVX512VL** (AVX-512 Vector Length Extensions) * **AVX512VBMI** (AVX-512 Vector Bit Manipulation Instructions) * **MPX** (Intel MPX (Memory Protection Extensions)) * **ERMS** (Enhanced REP MOVSB/STOSB) * **RDTSCP** (RDTSCP Instruction) * **CX16** (CMPXCHG16B Instruction) * **SGX** (Software Guard Extensions, with activation details) ## Performance * **RDTSCP()** Returns current cycle count. Can be used for benchmarking. * **SSE2SLOW** (SSE2 is supported, but usually not faster) * **SSE3SLOW** (SSE3 is supported, but usually not faster) * **ATOM** (Atom processor, some SSSE3 instructions are slower) * **Cache line** (Probable size of a cache line). * **L1, L2, L3 Cache size** on newer Intel/AMD CPUs. ## Cpu Vendor/VM * **Intel** * **AMD** * **VIA** * **Transmeta** * **NSC** * **KVM** (Kernel-based Virtual Machine) * **MSVM** (Microsoft Hyper-V or Windows Virtual PC) * **VMware** * **XenHVM** # installing ```go get github.com/klauspost/cpuid``` # example ```Go package main import ( "fmt" "github.com/klauspost/cpuid" ) func main() { // Print basic CPU information: fmt.Println("Name:", cpuid.CPU.BrandName) fmt.Println("PhysicalCores:", cpuid.CPU.PhysicalCores) fmt.Println("ThreadsPerCore:", cpuid.CPU.ThreadsPerCore) fmt.Println("LogicalCores:", cpuid.CPU.LogicalCores) fmt.Println("Family", cpuid.CPU.Family, "Model:", cpuid.CPU.Model) fmt.Println("Features:", cpuid.CPU.Features) fmt.Println("Cacheline bytes:", cpuid.CPU.CacheLine) fmt.Println("L1 Data Cache:", cpuid.CPU.Cache.L1D, "bytes") fmt.Println("L1 Instruction Cache:", cpuid.CPU.Cache.L1D, "bytes") fmt.Println("L2 Cache:", cpuid.CPU.Cache.L2, "bytes") fmt.Println("L3 Cache:", cpuid.CPU.Cache.L3, "bytes") // Test if we have a specific feature: if cpuid.CPU.SSE() { fmt.Println("We have Streaming SIMD Extensions") } } ``` Sample output: ``` >go run main.go Name: Intel(R) Core(TM) i5-2540M CPU @ 2.60GHz PhysicalCores: 2 ThreadsPerCore: 2 LogicalCores: 4 Family 6 Model: 42 Features: CMOV,MMX,MMXEXT,SSE,SSE2,SSE3,SSSE3,SSE4.1,SSE4.2,AVX,AESNI,CLMUL Cacheline bytes: 64 We have Streaming SIMD Extensions ``` # private package In the "private" folder you can find an autogenerated version of the library you can include in your own packages. For this purpose all exports are removed, and functions and constants are lowercased. This is not a recommended way of using the library, but provided for convenience, if it is difficult for you to use external packages. # license This code is published under an MIT license. See LICENSE file for more information. cpuid-1.1/cpuid.go000066400000000000000000000664271313655072600141410ustar00rootroot00000000000000// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. // Package cpuid provides information about the CPU running the current program. // // CPU features are detected on startup, and kept for fast access through the life of the application. // Currently x86 / x64 (AMD64) is supported. // // You can access the CPU information by accessing the shared CPU variable of the cpuid library. // // Package home: https://github.com/klauspost/cpuid package cpuid import "strings" // Vendor is a representation of a CPU vendor. type Vendor int const ( Other Vendor = iota Intel AMD VIA Transmeta NSC KVM // Kernel-based Virtual Machine MSVM // Microsoft Hyper-V or Windows Virtual PC VMware XenHVM ) const ( CMOV = 1 << iota // i686 CMOV NX // NX (No-Execute) bit AMD3DNOW // AMD 3DNOW AMD3DNOWEXT // AMD 3DNowExt MMX // standard MMX MMXEXT // SSE integer functions or AMD MMX ext SSE // SSE functions SSE2 // P4 SSE functions SSE3 // Prescott SSE3 functions SSSE3 // Conroe SSSE3 functions SSE4 // Penryn SSE4.1 functions SSE4A // AMD Barcelona microarchitecture SSE4a instructions SSE42 // Nehalem SSE4.2 functions AVX // AVX functions AVX2 // AVX2 functions FMA3 // Intel FMA 3 FMA4 // Bulldozer FMA4 functions XOP // Bulldozer XOP functions F16C // Half-precision floating-point conversion BMI1 // Bit Manipulation Instruction Set 1 BMI2 // Bit Manipulation Instruction Set 2 TBM // AMD Trailing Bit Manipulation LZCNT // LZCNT instruction POPCNT // POPCNT instruction AESNI // Advanced Encryption Standard New Instructions CLMUL // Carry-less Multiplication HTT // Hyperthreading (enabled) HLE // Hardware Lock Elision RTM // Restricted Transactional Memory RDRAND // RDRAND instruction is available RDSEED // RDSEED instruction is available ADX // Intel ADX (Multi-Precision Add-Carry Instruction Extensions) SHA // Intel SHA Extensions AVX512F // AVX-512 Foundation AVX512DQ // AVX-512 Doubleword and Quadword Instructions AVX512IFMA // AVX-512 Integer Fused Multiply-Add Instructions AVX512PF // AVX-512 Prefetch Instructions AVX512ER // AVX-512 Exponential and Reciprocal Instructions AVX512CD // AVX-512 Conflict Detection Instructions AVX512BW // AVX-512 Byte and Word Instructions AVX512VL // AVX-512 Vector Length Extensions AVX512VBMI // AVX-512 Vector Bit Manipulation Instructions MPX // Intel MPX (Memory Protection Extensions) ERMS // Enhanced REP MOVSB/STOSB RDTSCP // RDTSCP Instruction CX16 // CMPXCHG16B Instruction SGX // Software Guard Extensions // Performance indicators SSE2SLOW // SSE2 is supported, but usually not faster SSE3SLOW // SSE3 is supported, but usually not faster ATOM // Atom processor, some SSSE3 instructions are slower ) var flagNames = map[Flags]string{ CMOV: "CMOV", // i686 CMOV NX: "NX", // NX (No-Execute) bit AMD3DNOW: "AMD3DNOW", // AMD 3DNOW AMD3DNOWEXT: "AMD3DNOWEXT", // AMD 3DNowExt MMX: "MMX", // Standard MMX MMXEXT: "MMXEXT", // SSE integer functions or AMD MMX ext SSE: "SSE", // SSE functions SSE2: "SSE2", // P4 SSE2 functions SSE3: "SSE3", // Prescott SSE3 functions SSSE3: "SSSE3", // Conroe SSSE3 functions SSE4: "SSE4.1", // Penryn SSE4.1 functions SSE4A: "SSE4A", // AMD Barcelona microarchitecture SSE4a instructions SSE42: "SSE4.2", // Nehalem SSE4.2 functions AVX: "AVX", // AVX functions AVX2: "AVX2", // AVX functions FMA3: "FMA3", // Intel FMA 3 FMA4: "FMA4", // Bulldozer FMA4 functions XOP: "XOP", // Bulldozer XOP functions F16C: "F16C", // Half-precision floating-point conversion BMI1: "BMI1", // Bit Manipulation Instruction Set 1 BMI2: "BMI2", // Bit Manipulation Instruction Set 2 TBM: "TBM", // AMD Trailing Bit Manipulation LZCNT: "LZCNT", // LZCNT instruction POPCNT: "POPCNT", // POPCNT instruction AESNI: "AESNI", // Advanced Encryption Standard New Instructions CLMUL: "CLMUL", // Carry-less Multiplication HTT: "HTT", // Hyperthreading (enabled) HLE: "HLE", // Hardware Lock Elision RTM: "RTM", // Restricted Transactional Memory RDRAND: "RDRAND", // RDRAND instruction is available RDSEED: "RDSEED", // RDSEED instruction is available ADX: "ADX", // Intel ADX (Multi-Precision Add-Carry Instruction Extensions) SHA: "SHA", // Intel SHA Extensions AVX512F: "AVX512F", // AVX-512 Foundation AVX512DQ: "AVX512DQ", // AVX-512 Doubleword and Quadword Instructions AVX512IFMA: "AVX512IFMA", // AVX-512 Integer Fused Multiply-Add Instructions AVX512PF: "AVX512PF", // AVX-512 Prefetch Instructions AVX512ER: "AVX512ER", // AVX-512 Exponential and Reciprocal Instructions AVX512CD: "AVX512CD", // AVX-512 Conflict Detection Instructions AVX512BW: "AVX512BW", // AVX-512 Byte and Word Instructions AVX512VL: "AVX512VL", // AVX-512 Vector Length Extensions AVX512VBMI: "AVX512VBMI", // AVX-512 Vector Bit Manipulation Instructions MPX: "MPX", // Intel MPX (Memory Protection Extensions) ERMS: "ERMS", // Enhanced REP MOVSB/STOSB RDTSCP: "RDTSCP", // RDTSCP Instruction CX16: "CX16", // CMPXCHG16B Instruction SGX: "SGX", // Software Guard Extensions // Performance indicators SSE2SLOW: "SSE2SLOW", // SSE2 supported, but usually not faster SSE3SLOW: "SSE3SLOW", // SSE3 supported, but usually not faster ATOM: "ATOM", // Atom processor, some SSSE3 instructions are slower } // CPUInfo contains information about the detected system CPU. type CPUInfo struct { BrandName string // Brand name reported by the CPU VendorID Vendor // Comparable CPU vendor ID Features Flags // Features of the CPU PhysicalCores int // Number of physical processor cores in your CPU. Will be 0 if undetectable. ThreadsPerCore int // Number of threads per physical core. Will be 1 if undetectable. LogicalCores int // Number of physical cores times threads that can run on each core through the use of hyperthreading. Will be 0 if undetectable. Family int // CPU family number Model int // CPU model number CacheLine int // Cache line size in bytes. Will be 0 if undetectable. Cache struct { L1I int // L1 Instruction Cache (per core or shared). Will be -1 if undetected L1D int // L1 Data Cache (per core or shared). Will be -1 if undetected L2 int // L2 Cache (per core or shared). Will be -1 if undetected L3 int // L3 Instruction Cache (per core or shared). Will be -1 if undetected } SGX SGXSupport maxFunc uint32 maxExFunc uint32 } var cpuid func(op uint32) (eax, ebx, ecx, edx uint32) var cpuidex func(op, op2 uint32) (eax, ebx, ecx, edx uint32) var xgetbv func(index uint32) (eax, edx uint32) var rdtscpAsm func() (eax, ebx, ecx, edx uint32) // CPU contains information about the CPU as detected on startup, // or when Detect last was called. // // Use this as the primary entry point to you data, // this way queries are var CPU CPUInfo func init() { initCPU() Detect() } // Detect will re-detect current CPU info. // This will replace the content of the exported CPU variable. // // Unless you expect the CPU to change while you are running your program // you should not need to call this function. // If you call this, you must ensure that no other goroutine is accessing the // exported CPU variable. func Detect() { CPU.maxFunc = maxFunctionID() CPU.maxExFunc = maxExtendedFunction() CPU.BrandName = brandName() CPU.CacheLine = cacheLine() CPU.Family, CPU.Model = familyModel() CPU.Features = support() CPU.SGX = hasSGX(CPU.Features&SGX != 0) CPU.ThreadsPerCore = threadsPerCore() CPU.LogicalCores = logicalCores() CPU.PhysicalCores = physicalCores() CPU.VendorID = vendorID() CPU.cacheSize() } // Generated here: http://play.golang.org/p/BxFH2Gdc0G // Cmov indicates support of CMOV instructions func (c CPUInfo) Cmov() bool { return c.Features&CMOV != 0 } // Amd3dnow indicates support of AMD 3DNOW! instructions func (c CPUInfo) Amd3dnow() bool { return c.Features&AMD3DNOW != 0 } // Amd3dnowExt indicates support of AMD 3DNOW! Extended instructions func (c CPUInfo) Amd3dnowExt() bool { return c.Features&AMD3DNOWEXT != 0 } // MMX indicates support of MMX instructions func (c CPUInfo) MMX() bool { return c.Features&MMX != 0 } // MMXExt indicates support of MMXEXT instructions // (SSE integer functions or AMD MMX ext) func (c CPUInfo) MMXExt() bool { return c.Features&MMXEXT != 0 } // SSE indicates support of SSE instructions func (c CPUInfo) SSE() bool { return c.Features&SSE != 0 } // SSE2 indicates support of SSE 2 instructions func (c CPUInfo) SSE2() bool { return c.Features&SSE2 != 0 } // SSE3 indicates support of SSE 3 instructions func (c CPUInfo) SSE3() bool { return c.Features&SSE3 != 0 } // SSSE3 indicates support of SSSE 3 instructions func (c CPUInfo) SSSE3() bool { return c.Features&SSSE3 != 0 } // SSE4 indicates support of SSE 4 (also called SSE 4.1) instructions func (c CPUInfo) SSE4() bool { return c.Features&SSE4 != 0 } // SSE42 indicates support of SSE4.2 instructions func (c CPUInfo) SSE42() bool { return c.Features&SSE42 != 0 } // AVX indicates support of AVX instructions // and operating system support of AVX instructions func (c CPUInfo) AVX() bool { return c.Features&AVX != 0 } // AVX2 indicates support of AVX2 instructions func (c CPUInfo) AVX2() bool { return c.Features&AVX2 != 0 } // FMA3 indicates support of FMA3 instructions func (c CPUInfo) FMA3() bool { return c.Features&FMA3 != 0 } // FMA4 indicates support of FMA4 instructions func (c CPUInfo) FMA4() bool { return c.Features&FMA4 != 0 } // XOP indicates support of XOP instructions func (c CPUInfo) XOP() bool { return c.Features&XOP != 0 } // F16C indicates support of F16C instructions func (c CPUInfo) F16C() bool { return c.Features&F16C != 0 } // BMI1 indicates support of BMI1 instructions func (c CPUInfo) BMI1() bool { return c.Features&BMI1 != 0 } // BMI2 indicates support of BMI2 instructions func (c CPUInfo) BMI2() bool { return c.Features&BMI2 != 0 } // TBM indicates support of TBM instructions // (AMD Trailing Bit Manipulation) func (c CPUInfo) TBM() bool { return c.Features&TBM != 0 } // Lzcnt indicates support of LZCNT instruction func (c CPUInfo) Lzcnt() bool { return c.Features&LZCNT != 0 } // Popcnt indicates support of POPCNT instruction func (c CPUInfo) Popcnt() bool { return c.Features&POPCNT != 0 } // HTT indicates the processor has Hyperthreading enabled func (c CPUInfo) HTT() bool { return c.Features&HTT != 0 } // SSE2Slow indicates that SSE2 may be slow on this processor func (c CPUInfo) SSE2Slow() bool { return c.Features&SSE2SLOW != 0 } // SSE3Slow indicates that SSE3 may be slow on this processor func (c CPUInfo) SSE3Slow() bool { return c.Features&SSE3SLOW != 0 } // AesNi indicates support of AES-NI instructions // (Advanced Encryption Standard New Instructions) func (c CPUInfo) AesNi() bool { return c.Features&AESNI != 0 } // Clmul indicates support of CLMUL instructions // (Carry-less Multiplication) func (c CPUInfo) Clmul() bool { return c.Features&CLMUL != 0 } // NX indicates support of NX (No-Execute) bit func (c CPUInfo) NX() bool { return c.Features&NX != 0 } // SSE4A indicates support of AMD Barcelona microarchitecture SSE4a instructions func (c CPUInfo) SSE4A() bool { return c.Features&SSE4A != 0 } // HLE indicates support of Hardware Lock Elision func (c CPUInfo) HLE() bool { return c.Features&HLE != 0 } // RTM indicates support of Restricted Transactional Memory func (c CPUInfo) RTM() bool { return c.Features&RTM != 0 } // Rdrand indicates support of RDRAND instruction is available func (c CPUInfo) Rdrand() bool { return c.Features&RDRAND != 0 } // Rdseed indicates support of RDSEED instruction is available func (c CPUInfo) Rdseed() bool { return c.Features&RDSEED != 0 } // ADX indicates support of Intel ADX (Multi-Precision Add-Carry Instruction Extensions) func (c CPUInfo) ADX() bool { return c.Features&ADX != 0 } // SHA indicates support of Intel SHA Extensions func (c CPUInfo) SHA() bool { return c.Features&SHA != 0 } // AVX512F indicates support of AVX-512 Foundation func (c CPUInfo) AVX512F() bool { return c.Features&AVX512F != 0 } // AVX512DQ indicates support of AVX-512 Doubleword and Quadword Instructions func (c CPUInfo) AVX512DQ() bool { return c.Features&AVX512DQ != 0 } // AVX512IFMA indicates support of AVX-512 Integer Fused Multiply-Add Instructions func (c CPUInfo) AVX512IFMA() bool { return c.Features&AVX512IFMA != 0 } // AVX512PF indicates support of AVX-512 Prefetch Instructions func (c CPUInfo) AVX512PF() bool { return c.Features&AVX512PF != 0 } // AVX512ER indicates support of AVX-512 Exponential and Reciprocal Instructions func (c CPUInfo) AVX512ER() bool { return c.Features&AVX512ER != 0 } // AVX512CD indicates support of AVX-512 Conflict Detection Instructions func (c CPUInfo) AVX512CD() bool { return c.Features&AVX512CD != 0 } // AVX512BW indicates support of AVX-512 Byte and Word Instructions func (c CPUInfo) AVX512BW() bool { return c.Features&AVX512BW != 0 } // AVX512VL indicates support of AVX-512 Vector Length Extensions func (c CPUInfo) AVX512VL() bool { return c.Features&AVX512VL != 0 } // AVX512VBMI indicates support of AVX-512 Vector Bit Manipulation Instructions func (c CPUInfo) AVX512VBMI() bool { return c.Features&AVX512VBMI != 0 } // MPX indicates support of Intel MPX (Memory Protection Extensions) func (c CPUInfo) MPX() bool { return c.Features&MPX != 0 } // ERMS indicates support of Enhanced REP MOVSB/STOSB func (c CPUInfo) ERMS() bool { return c.Features&ERMS != 0 } // RDTSCP Instruction is available. func (c CPUInfo) RDTSCP() bool { return c.Features&RDTSCP != 0 } // CX16 indicates if CMPXCHG16B instruction is available. func (c CPUInfo) CX16() bool { return c.Features&CX16 != 0 } // TSX is split into HLE (Hardware Lock Elision) and RTM (Restricted Transactional Memory) detection. // So TSX simply checks that. func (c CPUInfo) TSX() bool { return c.Features&(MPX|RTM) == MPX|RTM } // Atom indicates an Atom processor func (c CPUInfo) Atom() bool { return c.Features&ATOM != 0 } // Intel returns true if vendor is recognized as Intel func (c CPUInfo) Intel() bool { return c.VendorID == Intel } // AMD returns true if vendor is recognized as AMD func (c CPUInfo) AMD() bool { return c.VendorID == AMD } // Transmeta returns true if vendor is recognized as Transmeta func (c CPUInfo) Transmeta() bool { return c.VendorID == Transmeta } // NSC returns true if vendor is recognized as National Semiconductor func (c CPUInfo) NSC() bool { return c.VendorID == NSC } // VIA returns true if vendor is recognized as VIA func (c CPUInfo) VIA() bool { return c.VendorID == VIA } // RTCounter returns the 64-bit time-stamp counter // Uses the RDTSCP instruction. The value 0 is returned // if the CPU does not support the instruction. func (c CPUInfo) RTCounter() uint64 { if !c.RDTSCP() { return 0 } a, _, _, d := rdtscpAsm() return uint64(a) | (uint64(d) << 32) } // Ia32TscAux returns the IA32_TSC_AUX part of the RDTSCP. // This variable is OS dependent, but on Linux contains information // about the current cpu/core the code is running on. // If the RDTSCP instruction isn't supported on the CPU, the value 0 is returned. func (c CPUInfo) Ia32TscAux() uint32 { if !c.RDTSCP() { return 0 } _, _, ecx, _ := rdtscpAsm() return ecx } // LogicalCPU will return the Logical CPU the code is currently executing on. // This is likely to change when the OS re-schedules the running thread // to another CPU. // If the current core cannot be detected, -1 will be returned. func (c CPUInfo) LogicalCPU() int { if c.maxFunc < 1 { return -1 } _, ebx, _, _ := cpuid(1) return int(ebx >> 24) } // VM Will return true if the cpu id indicates we are in // a virtual machine. This is only a hint, and will very likely // have many false negatives. func (c CPUInfo) VM() bool { switch c.VendorID { case MSVM, KVM, VMware, XenHVM: return true } return false } // Flags contains detected cpu features and caracteristics type Flags uint64 // String returns a string representation of the detected // CPU features. func (f Flags) String() string { return strings.Join(f.Strings(), ",") } // Strings returns and array of the detected features. func (f Flags) Strings() []string { s := support() r := make([]string, 0, 20) for i := uint(0); i < 64; i++ { key := Flags(1 << i) val := flagNames[key] if s&key != 0 { r = append(r, val) } } return r } func maxExtendedFunction() uint32 { eax, _, _, _ := cpuid(0x80000000) return eax } func maxFunctionID() uint32 { a, _, _, _ := cpuid(0) return a } func brandName() string { if maxExtendedFunction() >= 0x80000004 { v := make([]uint32, 0, 48) for i := uint32(0); i < 3; i++ { a, b, c, d := cpuid(0x80000002 + i) v = append(v, a, b, c, d) } return strings.Trim(string(valAsString(v...)), " ") } return "unknown" } func threadsPerCore() int { mfi := maxFunctionID() if mfi < 0x4 || vendorID() != Intel { return 1 } if mfi < 0xb { _, b, _, d := cpuid(1) if (d & (1 << 28)) != 0 { // v will contain logical core count v := (b >> 16) & 255 if v > 1 { a4, _, _, _ := cpuid(4) // physical cores v2 := (a4 >> 26) + 1 if v2 > 0 { return int(v) / int(v2) } } } return 1 } _, b, _, _ := cpuidex(0xb, 0) if b&0xffff == 0 { return 1 } return int(b & 0xffff) } func logicalCores() int { mfi := maxFunctionID() switch vendorID() { case Intel: // Use this on old Intel processors if mfi < 0xb { if mfi < 1 { return 0 } // CPUID.1:EBX[23:16] represents the maximum number of addressable IDs (initial APIC ID) // that can be assigned to logical processors in a physical package. // The value may not be the same as the number of logical processors that are present in the hardware of a physical package. _, ebx, _, _ := cpuid(1) logical := (ebx >> 16) & 0xff return int(logical) } _, b, _, _ := cpuidex(0xb, 1) return int(b & 0xffff) case AMD: _, b, _, _ := cpuid(1) return int((b >> 16) & 0xff) default: return 0 } } func familyModel() (int, int) { if maxFunctionID() < 0x1 { return 0, 0 } eax, _, _, _ := cpuid(1) family := ((eax >> 8) & 0xf) + ((eax >> 20) & 0xff) model := ((eax >> 4) & 0xf) + ((eax >> 12) & 0xf0) return int(family), int(model) } func physicalCores() int { switch vendorID() { case Intel: return logicalCores() / threadsPerCore() case AMD: if maxExtendedFunction() >= 0x80000008 { _, _, c, _ := cpuid(0x80000008) return int(c&0xff) + 1 } } return 0 } // Except from http://en.wikipedia.org/wiki/CPUID#EAX.3D0:_Get_vendor_ID var vendorMapping = map[string]Vendor{ "AMDisbetter!": AMD, "AuthenticAMD": AMD, "CentaurHauls": VIA, "GenuineIntel": Intel, "TransmetaCPU": Transmeta, "GenuineTMx86": Transmeta, "Geode by NSC": NSC, "VIA VIA VIA ": VIA, "KVMKVMKVMKVM": KVM, "Microsoft Hv": MSVM, "VMwareVMware": VMware, "XenVMMXenVMM": XenHVM, } func vendorID() Vendor { _, b, c, d := cpuid(0) v := valAsString(b, d, c) vend, ok := vendorMapping[string(v)] if !ok { return Other } return vend } func cacheLine() int { if maxFunctionID() < 0x1 { return 0 } _, ebx, _, _ := cpuid(1) cache := (ebx & 0xff00) >> 5 // cflush size if cache == 0 && maxExtendedFunction() >= 0x80000006 { _, _, ecx, _ := cpuid(0x80000006) cache = ecx & 0xff // cacheline size } // TODO: Read from Cache and TLB Information return int(cache) } func (c *CPUInfo) cacheSize() { c.Cache.L1D = -1 c.Cache.L1I = -1 c.Cache.L2 = -1 c.Cache.L3 = -1 vendor := vendorID() switch vendor { case Intel: if maxFunctionID() < 4 { return } for i := uint32(0); ; i++ { eax, ebx, ecx, _ := cpuidex(4, i) cacheType := eax & 15 if cacheType == 0 { break } cacheLevel := (eax >> 5) & 7 coherency := int(ebx&0xfff) + 1 partitions := int((ebx>>12)&0x3ff) + 1 associativity := int((ebx>>22)&0x3ff) + 1 sets := int(ecx) + 1 size := associativity * partitions * coherency * sets switch cacheLevel { case 1: if cacheType == 1 { // 1 = Data Cache c.Cache.L1D = size } else if cacheType == 2 { // 2 = Instruction Cache c.Cache.L1I = size } else { if c.Cache.L1D < 0 { c.Cache.L1I = size } if c.Cache.L1I < 0 { c.Cache.L1I = size } } case 2: c.Cache.L2 = size case 3: c.Cache.L3 = size } } case AMD: // Untested. if maxExtendedFunction() < 0x80000005 { return } _, _, ecx, edx := cpuid(0x80000005) c.Cache.L1D = int(((ecx >> 24) & 0xFF) * 1024) c.Cache.L1I = int(((edx >> 24) & 0xFF) * 1024) if maxExtendedFunction() < 0x80000006 { return } _, _, ecx, _ = cpuid(0x80000006) c.Cache.L2 = int(((ecx >> 16) & 0xFFFF) * 1024) } return } type SGXSupport struct { Available bool SGX1Supported bool SGX2Supported bool MaxEnclaveSizeNot64 int64 MaxEnclaveSize64 int64 } func hasSGX(available bool) (rval SGXSupport) { rval.Available = available if !available { return } a, _, _, d := cpuidex(0x12, 0) rval.SGX1Supported = a&0x01 != 0 rval.SGX2Supported = a&0x02 != 0 rval.MaxEnclaveSizeNot64 = 1 << (d & 0xFF) // pow 2 rval.MaxEnclaveSize64 = 1 << ((d >> 8) & 0xFF) // pow 2 return } func support() Flags { mfi := maxFunctionID() vend := vendorID() if mfi < 0x1 { return 0 } rval := uint64(0) _, _, c, d := cpuid(1) if (d & (1 << 15)) != 0 { rval |= CMOV } if (d & (1 << 23)) != 0 { rval |= MMX } if (d & (1 << 25)) != 0 { rval |= MMXEXT } if (d & (1 << 25)) != 0 { rval |= SSE } if (d & (1 << 26)) != 0 { rval |= SSE2 } if (c & 1) != 0 { rval |= SSE3 } if (c & 0x00000200) != 0 { rval |= SSSE3 } if (c & 0x00080000) != 0 { rval |= SSE4 } if (c & 0x00100000) != 0 { rval |= SSE42 } if (c & (1 << 25)) != 0 { rval |= AESNI } if (c & (1 << 1)) != 0 { rval |= CLMUL } if c&(1<<23) != 0 { rval |= POPCNT } if c&(1<<30) != 0 { rval |= RDRAND } if c&(1<<29) != 0 { rval |= F16C } if c&(1<<13) != 0 { rval |= CX16 } if vend == Intel && (d&(1<<28)) != 0 && mfi >= 4 { if threadsPerCore() > 1 { rval |= HTT } } // Check XGETBV, OXSAVE and AVX bits if c&(1<<26) != 0 && c&(1<<27) != 0 && c&(1<<28) != 0 { // Check for OS support eax, _ := xgetbv(0) if (eax & 0x6) == 0x6 { rval |= AVX if (c & 0x00001000) != 0 { rval |= FMA3 } } } // Check AVX2, AVX2 requires OS support, but BMI1/2 don't. if mfi >= 7 { _, ebx, ecx, _ := cpuidex(7, 0) if (rval&AVX) != 0 && (ebx&0x00000020) != 0 { rval |= AVX2 } if (ebx & 0x00000008) != 0 { rval |= BMI1 if (ebx & 0x00000100) != 0 { rval |= BMI2 } } if ebx&(1<<2) != 0 { rval |= SGX } if ebx&(1<<4) != 0 { rval |= HLE } if ebx&(1<<9) != 0 { rval |= ERMS } if ebx&(1<<11) != 0 { rval |= RTM } if ebx&(1<<14) != 0 { rval |= MPX } if ebx&(1<<18) != 0 { rval |= RDSEED } if ebx&(1<<19) != 0 { rval |= ADX } if ebx&(1<<29) != 0 { rval |= SHA } // Only detect AVX-512 features if XGETBV is supported if c&((1<<26)|(1<<27)) == (1<<26)|(1<<27) { // Check for OS support eax, _ := xgetbv(0) // Verify that XCR0[7:5] = ‘111b’ (OPMASK state, upper 256-bit of ZMM0-ZMM15 and // ZMM16-ZMM31 state are enabled by OS) /// and that XCR0[2:1] = ‘11b’ (XMM state and YMM state are enabled by OS). if (eax>>5)&7 == 7 && (eax>>1)&3 == 3 { if ebx&(1<<16) != 0 { rval |= AVX512F } if ebx&(1<<17) != 0 { rval |= AVX512DQ } if ebx&(1<<21) != 0 { rval |= AVX512IFMA } if ebx&(1<<26) != 0 { rval |= AVX512PF } if ebx&(1<<27) != 0 { rval |= AVX512ER } if ebx&(1<<28) != 0 { rval |= AVX512CD } if ebx&(1<<30) != 0 { rval |= AVX512BW } if ebx&(1<<31) != 0 { rval |= AVX512VL } // ecx if ecx&(1<<1) != 0 { rval |= AVX512VBMI } } } } if maxExtendedFunction() >= 0x80000001 { _, _, c, d := cpuid(0x80000001) if (c & (1 << 5)) != 0 { rval |= LZCNT rval |= POPCNT } if (d & (1 << 31)) != 0 { rval |= AMD3DNOW } if (d & (1 << 30)) != 0 { rval |= AMD3DNOWEXT } if (d & (1 << 23)) != 0 { rval |= MMX } if (d & (1 << 22)) != 0 { rval |= MMXEXT } if (c & (1 << 6)) != 0 { rval |= SSE4A } if d&(1<<20) != 0 { rval |= NX } if d&(1<<27) != 0 { rval |= RDTSCP } /* Allow for selectively disabling SSE2 functions on AMD processors with SSE2 support but not SSE4a. This includes Athlon64, some Opteron, and some Sempron processors. MMX, SSE, or 3DNow! are faster than SSE2 often enough to utilize this special-case flag. AV_CPU_FLAG_SSE2 and AV_CPU_FLAG_SSE2SLOW are both set in this case so that SSE2 is used unless explicitly disabled by checking AV_CPU_FLAG_SSE2SLOW. */ if vendorID() != Intel && rval&SSE2 != 0 && (c&0x00000040) == 0 { rval |= SSE2SLOW } /* XOP and FMA4 use the AVX instruction coding scheme, so they can't be * used unless the OS has AVX support. */ if (rval & AVX) != 0 { if (c & 0x00000800) != 0 { rval |= XOP } if (c & 0x00010000) != 0 { rval |= FMA4 } } if vendorID() == Intel { family, model := familyModel() if family == 6 && (model == 9 || model == 13 || model == 14) { /* 6/9 (pentium-m "banias"), 6/13 (pentium-m "dothan"), and * 6/14 (core1 "yonah") theoretically support sse2, but it's * usually slower than mmx. */ if (rval & SSE2) != 0 { rval |= SSE2SLOW } if (rval & SSE3) != 0 { rval |= SSE3SLOW } } /* The Atom processor has SSSE3 support, which is useful in many cases, * but sometimes the SSSE3 version is slower than the SSE2 equivalent * on the Atom, but is generally faster on other processors supporting * SSSE3. This flag allows for selectively disabling certain SSSE3 * functions on the Atom. */ if family == 6 && model == 28 { rval |= ATOM } } } return Flags(rval) } func valAsString(values ...uint32) []byte { r := make([]byte, 4*len(values)) for i, v := range values { dst := r[i*4:] dst[0] = byte(v & 0xff) dst[1] = byte((v >> 8) & 0xff) dst[2] = byte((v >> 16) & 0xff) dst[3] = byte((v >> 24) & 0xff) switch { case dst[0] == 0: return r[:i*4] case dst[1] == 0: return r[:i*4+1] case dst[2] == 0: return r[:i*4+2] case dst[3] == 0: return r[:i*4+3] } } return r } cpuid-1.1/cpuid_386.s000066400000000000000000000016571313655072600143700ustar00rootroot00000000000000// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. // +build 386,!gccgo // func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) TEXT ·asmCpuid(SB), 7, $0 XORL CX, CX MOVL op+0(FP), AX CPUID MOVL AX, eax+4(FP) MOVL BX, ebx+8(FP) MOVL CX, ecx+12(FP) MOVL DX, edx+16(FP) RET // func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) TEXT ·asmCpuidex(SB), 7, $0 MOVL op+0(FP), AX MOVL op2+4(FP), CX CPUID MOVL AX, eax+8(FP) MOVL BX, ebx+12(FP) MOVL CX, ecx+16(FP) MOVL DX, edx+20(FP) RET // func xgetbv(index uint32) (eax, edx uint32) TEXT ·asmXgetbv(SB), 7, $0 MOVL index+0(FP), CX BYTE $0x0f; BYTE $0x01; BYTE $0xd0 // XGETBV MOVL AX, eax+4(FP) MOVL DX, edx+8(FP) RET // func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) TEXT ·asmRdtscpAsm(SB), 7, $0 BYTE $0x0F; BYTE $0x01; BYTE $0xF9 // RDTSCP MOVL AX, eax+0(FP) MOVL BX, ebx+4(FP) MOVL CX, ecx+8(FP) MOVL DX, edx+12(FP) RET cpuid-1.1/cpuid_amd64.s000066400000000000000000000016651313655072600147620ustar00rootroot00000000000000// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. //+build amd64,!gccgo // func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) TEXT ·asmCpuid(SB), 7, $0 XORQ CX, CX MOVL op+0(FP), AX CPUID MOVL AX, eax+8(FP) MOVL BX, ebx+12(FP) MOVL CX, ecx+16(FP) MOVL DX, edx+20(FP) RET // func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) TEXT ·asmCpuidex(SB), 7, $0 MOVL op+0(FP), AX MOVL op2+4(FP), CX CPUID MOVL AX, eax+8(FP) MOVL BX, ebx+12(FP) MOVL CX, ecx+16(FP) MOVL DX, edx+20(FP) RET // func asmXgetbv(index uint32) (eax, edx uint32) TEXT ·asmXgetbv(SB), 7, $0 MOVL index+0(FP), CX BYTE $0x0f; BYTE $0x01; BYTE $0xd0 // XGETBV MOVL AX, eax+8(FP) MOVL DX, edx+12(FP) RET // func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) TEXT ·asmRdtscpAsm(SB), 7, $0 BYTE $0x0F; BYTE $0x01; BYTE $0xF9 // RDTSCP MOVL AX, eax+0(FP) MOVL BX, ebx+4(FP) MOVL CX, ecx+8(FP) MOVL DX, edx+12(FP) RET cpuid-1.1/cpuid_test.go000066400000000000000000000507101313655072600151640ustar00rootroot00000000000000// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. package cpuid import ( "fmt" "testing" ) // There is no real way to test a CPU identifier, since results will // obviously differ on each machine. func TestCPUID(t *testing.T) { n := maxFunctionID() t.Logf("Max Function:0x%x\n", n) n = maxExtendedFunction() t.Logf("Max Extended Function:0x%x\n", n) t.Log("Name:", CPU.BrandName) t.Log("PhysicalCores:", CPU.PhysicalCores) t.Log("ThreadsPerCore:", CPU.ThreadsPerCore) t.Log("LogicalCores:", CPU.LogicalCores) t.Log("Family", CPU.Family, "Model:", CPU.Model) t.Log("Features:", CPU.Features) t.Log("Cacheline bytes:", CPU.CacheLine) t.Log("L1 Instruction Cache:", CPU.Cache.L1I, "bytes") t.Log("L1 Data Cache:", CPU.Cache.L1D, "bytes") t.Log("L2 Cache:", CPU.Cache.L2, "bytes") t.Log("L3 Cache:", CPU.Cache.L3, "bytes") if CPU.SSE2() { t.Log("We have SSE2") } } func TestDumpCPUID(t *testing.T) { n := int(maxFunctionID()) for i := 0; i <= n; i++ { a, b, c, d := cpuidex(uint32(i), 0) t.Logf("CPUID %08x: %08x-%08x-%08x-%08x", i, a, b, c, d) ex := uint32(1) for { a2, b2, c2, d2 := cpuidex(uint32(i), ex) if a2 == a && b2 == b && d2 == d || ex > 50 || a2 == 0 { break } t.Logf("CPUID %08x: %08x-%08x-%08x-%08x", i, a2, b2, c2, d2) a, b, c, d = a2, b2, c2, d2 ex++ } } n2 := maxExtendedFunction() for i := uint32(0x80000000); i <= n2; i++ { a, b, c, d := cpuid(i) t.Logf("CPUID %08x: %08x-%08x-%08x-%08x", i, a, b, c, d) } } func Example() { // Print basic CPU information: fmt.Println("Name:", CPU.BrandName) fmt.Println("PhysicalCores:", CPU.PhysicalCores) fmt.Println("ThreadsPerCore:", CPU.ThreadsPerCore) fmt.Println("LogicalCores:", CPU.LogicalCores) fmt.Println("Family", CPU.Family, "Model:", CPU.Model) fmt.Println("Features:", CPU.Features) fmt.Println("Cacheline bytes:", CPU.CacheLine) // Test if we have a specific feature: if CPU.SSE() { fmt.Println("We have Streaming SIMD Extensions") } } func TestBrandNameZero(t *testing.T) { if len(CPU.BrandName) > 0 { // Cut out last byte last := []byte(CPU.BrandName[len(CPU.BrandName)-1:]) if last[0] == 0 { t.Fatal("last byte was zero") } else if last[0] == 32 { t.Fatal("whitespace wasn't trimmed") } } } // Generated here: http://play.golang.org/p/mko-0tFt0Q // TestCmov tests Cmov() function func TestCmov(t *testing.T) { got := CPU.Cmov() expected := CPU.Features&CMOV == CMOV if got != expected { t.Fatalf("Cmov: expected %v, got %v", expected, got) } t.Log("CMOV Support:", got) } // TestAmd3dnow tests Amd3dnow() function func TestAmd3dnow(t *testing.T) { got := CPU.Amd3dnow() expected := CPU.Features&AMD3DNOW == AMD3DNOW if got != expected { t.Fatalf("Amd3dnow: expected %v, got %v", expected, got) } t.Log("AMD3DNOW Support:", got) } // TestAmd3dnowExt tests Amd3dnowExt() function func TestAmd3dnowExt(t *testing.T) { got := CPU.Amd3dnowExt() expected := CPU.Features&AMD3DNOWEXT == AMD3DNOWEXT if got != expected { t.Fatalf("Amd3dnowExt: expected %v, got %v", expected, got) } t.Log("AMD3DNOWEXT Support:", got) } // TestMMX tests MMX() function func TestMMX(t *testing.T) { got := CPU.MMX() expected := CPU.Features&MMX == MMX if got != expected { t.Fatalf("MMX: expected %v, got %v", expected, got) } t.Log("MMX Support:", got) } // TestMMXext tests MMXext() function func TestMMXext(t *testing.T) { got := CPU.MMXExt() expected := CPU.Features&MMXEXT == MMXEXT if got != expected { t.Fatalf("MMXExt: expected %v, got %v", expected, got) } t.Log("MMXEXT Support:", got) } // TestSSE tests SSE() function func TestSSE(t *testing.T) { got := CPU.SSE() expected := CPU.Features&SSE == SSE if got != expected { t.Fatalf("SSE: expected %v, got %v", expected, got) } t.Log("SSE Support:", got) } // TestSSE2 tests SSE2() function func TestSSE2(t *testing.T) { got := CPU.SSE2() expected := CPU.Features&SSE2 == SSE2 if got != expected { t.Fatalf("SSE2: expected %v, got %v", expected, got) } t.Log("SSE2 Support:", got) } // TestSSE3 tests SSE3() function func TestSSE3(t *testing.T) { got := CPU.SSE3() expected := CPU.Features&SSE3 == SSE3 if got != expected { t.Fatalf("SSE3: expected %v, got %v", expected, got) } t.Log("SSE3 Support:", got) } // TestSSSE3 tests SSSE3() function func TestSSSE3(t *testing.T) { got := CPU.SSSE3() expected := CPU.Features&SSSE3 == SSSE3 if got != expected { t.Fatalf("SSSE3: expected %v, got %v", expected, got) } t.Log("SSSE3 Support:", got) } // TestSSE4 tests SSE4() function func TestSSE4(t *testing.T) { got := CPU.SSE4() expected := CPU.Features&SSE4 == SSE4 if got != expected { t.Fatalf("SSE4: expected %v, got %v", expected, got) } t.Log("SSE4 Support:", got) } // TestSSE42 tests SSE42() function func TestSSE42(t *testing.T) { got := CPU.SSE42() expected := CPU.Features&SSE42 == SSE42 if got != expected { t.Fatalf("SSE42: expected %v, got %v", expected, got) } t.Log("SSE42 Support:", got) } // TestAVX tests AVX() function func TestAVX(t *testing.T) { got := CPU.AVX() expected := CPU.Features&AVX == AVX if got != expected { t.Fatalf("AVX: expected %v, got %v", expected, got) } t.Log("AVX Support:", got) } // TestAVX2 tests AVX2() function func TestAVX2(t *testing.T) { got := CPU.AVX2() expected := CPU.Features&AVX2 == AVX2 if got != expected { t.Fatalf("AVX2: expected %v, got %v", expected, got) } t.Log("AVX2 Support:", got) } // TestFMA3 tests FMA3() function func TestFMA3(t *testing.T) { got := CPU.FMA3() expected := CPU.Features&FMA3 == FMA3 if got != expected { t.Fatalf("FMA3: expected %v, got %v", expected, got) } t.Log("FMA3 Support:", got) } // TestFMA4 tests FMA4() function func TestFMA4(t *testing.T) { got := CPU.FMA4() expected := CPU.Features&FMA4 == FMA4 if got != expected { t.Fatalf("FMA4: expected %v, got %v", expected, got) } t.Log("FMA4 Support:", got) } // TestXOP tests XOP() function func TestXOP(t *testing.T) { got := CPU.XOP() expected := CPU.Features&XOP == XOP if got != expected { t.Fatalf("XOP: expected %v, got %v", expected, got) } t.Log("XOP Support:", got) } // TestF16C tests F16C() function func TestF16C(t *testing.T) { got := CPU.F16C() expected := CPU.Features&F16C == F16C if got != expected { t.Fatalf("F16C: expected %v, got %v", expected, got) } t.Log("F16C Support:", got) } // TestCX16 tests CX16() function func TestCX16(t *testing.T) { got := CPU.CX16() expected := CPU.Features&CX16 == CX16 if got != expected { t.Fatalf("CX16: expected %v, got %v", expected, got) } t.Log("CX16 Support:", got) } // TestSGX tests SGX() function func TestSGX(t *testing.T) { got := CPU.SGX.Available expected := CPU.Features&SGX == SGX if got != expected { t.Fatalf("SGX: expected %v, got %v", expected, got) } t.Log("SGX Support:", got) } // TestBMI1 tests BMI1() function func TestBMI1(t *testing.T) { got := CPU.BMI1() expected := CPU.Features&BMI1 == BMI1 if got != expected { t.Fatalf("BMI1: expected %v, got %v", expected, got) } t.Log("BMI1 Support:", got) } // TestBMI2 tests BMI2() function func TestBMI2(t *testing.T) { got := CPU.BMI2() expected := CPU.Features&BMI2 == BMI2 if got != expected { t.Fatalf("BMI2: expected %v, got %v", expected, got) } t.Log("BMI2 Support:", got) } // TestTBM tests TBM() function func TestTBM(t *testing.T) { got := CPU.TBM() expected := CPU.Features&TBM == TBM if got != expected { t.Fatalf("TBM: expected %v, got %v", expected, got) } t.Log("TBM Support:", got) } // TestLzcnt tests Lzcnt() function func TestLzcnt(t *testing.T) { got := CPU.Lzcnt() expected := CPU.Features&LZCNT == LZCNT if got != expected { t.Fatalf("Lzcnt: expected %v, got %v", expected, got) } t.Log("LZCNT Support:", got) } // TestLzcnt tests Lzcnt() function func TestPopcnt(t *testing.T) { got := CPU.Popcnt() expected := CPU.Features&POPCNT == POPCNT if got != expected { t.Fatalf("Popcnt: expected %v, got %v", expected, got) } t.Log("POPCNT Support:", got) } // TestAesNi tests AesNi() function func TestAesNi(t *testing.T) { got := CPU.AesNi() expected := CPU.Features&AESNI == AESNI if got != expected { t.Fatalf("AesNi: expected %v, got %v", expected, got) } t.Log("AESNI Support:", got) } // TestHTT tests HTT() function func TestHTT(t *testing.T) { got := CPU.HTT() expected := CPU.Features&HTT == HTT if got != expected { t.Fatalf("HTT: expected %v, got %v", expected, got) } t.Log("HTT Support:", got) } // TestClmul tests Clmul() function func TestClmul(t *testing.T) { got := CPU.Clmul() expected := CPU.Features&CLMUL == CLMUL if got != expected { t.Fatalf("Clmul: expected %v, got %v", expected, got) } t.Log("CLMUL Support:", got) } // TestSSE2Slow tests SSE2Slow() function func TestSSE2Slow(t *testing.T) { got := CPU.SSE2Slow() expected := CPU.Features&SSE2SLOW == SSE2SLOW if got != expected { t.Fatalf("SSE2Slow: expected %v, got %v", expected, got) } t.Log("SSE2SLOW Support:", got) } // TestSSE3Slow tests SSE3slow() function func TestSSE3Slow(t *testing.T) { got := CPU.SSE3Slow() expected := CPU.Features&SSE3SLOW == SSE3SLOW if got != expected { t.Fatalf("SSE3slow: expected %v, got %v", expected, got) } t.Log("SSE3SLOW Support:", got) } // TestAtom tests Atom() function func TestAtom(t *testing.T) { got := CPU.Atom() expected := CPU.Features&ATOM == ATOM if got != expected { t.Fatalf("Atom: expected %v, got %v", expected, got) } t.Log("ATOM Support:", got) } // TestNX tests NX() function (NX (No-Execute) bit) func TestNX(t *testing.T) { got := CPU.NX() expected := CPU.Features&NX == NX if got != expected { t.Fatalf("NX: expected %v, got %v", expected, got) } t.Log("NX Support:", got) } // TestSSE4A tests SSE4A() function (AMD Barcelona microarchitecture SSE4a instructions) func TestSSE4A(t *testing.T) { got := CPU.SSE4A() expected := CPU.Features&SSE4A == SSE4A if got != expected { t.Fatalf("SSE4A: expected %v, got %v", expected, got) } t.Log("SSE4A Support:", got) } // TestHLE tests HLE() function (Hardware Lock Elision) func TestHLE(t *testing.T) { got := CPU.HLE() expected := CPU.Features&HLE == HLE if got != expected { t.Fatalf("HLE: expected %v, got %v", expected, got) } t.Log("HLE Support:", got) } // TestRTM tests RTM() function (Restricted Transactional Memory) func TestRTM(t *testing.T) { got := CPU.RTM() expected := CPU.Features&RTM == RTM if got != expected { t.Fatalf("RTM: expected %v, got %v", expected, got) } t.Log("RTM Support:", got) } // TestRdrand tests RDRAND() function (RDRAND instruction is available) func TestRdrand(t *testing.T) { got := CPU.Rdrand() expected := CPU.Features&RDRAND == RDRAND if got != expected { t.Fatalf("Rdrand: expected %v, got %v", expected, got) } t.Log("Rdrand Support:", got) } // TestRdseed tests RDSEED() function (RDSEED instruction is available) func TestRdseed(t *testing.T) { got := CPU.Rdseed() expected := CPU.Features&RDSEED == RDSEED if got != expected { t.Fatalf("Rdseed: expected %v, got %v", expected, got) } t.Log("Rdseed Support:", got) } // TestADX tests ADX() function (Intel ADX (Multi-Precision Add-Carry Instruction Extensions)) func TestADX(t *testing.T) { got := CPU.ADX() expected := CPU.Features&ADX == ADX if got != expected { t.Fatalf("ADX: expected %v, got %v", expected, got) } t.Log("ADX Support:", got) } // TestSHA tests SHA() function (Intel SHA Extensions) func TestSHA(t *testing.T) { got := CPU.SHA() expected := CPU.Features&SHA == SHA if got != expected { t.Fatalf("SHA: expected %v, got %v", expected, got) } t.Log("SHA Support:", got) } // TestAVX512F tests AVX512F() function (AVX-512 Foundation) func TestAVX512F(t *testing.T) { got := CPU.AVX512F() expected := CPU.Features&AVX512F == AVX512F if got != expected { t.Fatalf("AVX512F: expected %v, got %v", expected, got) } t.Log("AVX512F Support:", got) } // TestAVX512DQ tests AVX512DQ() function (AVX-512 Doubleword and Quadword Instructions) func TestAVX512DQ(t *testing.T) { got := CPU.AVX512DQ() expected := CPU.Features&AVX512DQ == AVX512DQ if got != expected { t.Fatalf("AVX512DQ: expected %v, got %v", expected, got) } t.Log("AVX512DQ Support:", got) } // TestAVX512IFMA tests AVX512IFMA() function (AVX-512 Integer Fused Multiply-Add Instructions) func TestAVX512IFMA(t *testing.T) { got := CPU.AVX512IFMA() expected := CPU.Features&AVX512IFMA == AVX512IFMA if got != expected { t.Fatalf("AVX512IFMA: expected %v, got %v", expected, got) } t.Log("AVX512IFMA Support:", got) } // TestAVX512PF tests AVX512PF() function (AVX-512 Prefetch Instructions) func TestAVX512PF(t *testing.T) { got := CPU.AVX512PF() expected := CPU.Features&AVX512PF == AVX512PF if got != expected { t.Fatalf("AVX512PF: expected %v, got %v", expected, got) } t.Log("AVX512PF Support:", got) } // TestAVX512ER tests AVX512ER() function (AVX-512 Exponential and Reciprocal Instructions) func TestAVX512ER(t *testing.T) { got := CPU.AVX512ER() expected := CPU.Features&AVX512ER == AVX512ER if got != expected { t.Fatalf("AVX512ER: expected %v, got %v", expected, got) } t.Log("AVX512ER Support:", got) } // TestAVX512CD tests AVX512CD() function (AVX-512 Conflict Detection Instructions) func TestAVX512CD(t *testing.T) { got := CPU.AVX512CD() expected := CPU.Features&AVX512CD == AVX512CD if got != expected { t.Fatalf("AVX512CD: expected %v, got %v", expected, got) } t.Log("AVX512CD Support:", got) } // TestAVX512BW tests AVX512BW() function (AVX-512 Byte and Word Instructions) func TestAVX512BW(t *testing.T) { got := CPU.AVX512BW() expected := CPU.Features&AVX512BW == AVX512BW if got != expected { t.Fatalf("AVX512BW: expected %v, got %v", expected, got) } t.Log("AVX512BW Support:", got) } // TestAVX512VL tests AVX512VL() function (AVX-512 Vector Length Extensions) func TestAVX512VL(t *testing.T) { got := CPU.AVX512VL() expected := CPU.Features&AVX512VL == AVX512VL if got != expected { t.Fatalf("AVX512VL: expected %v, got %v", expected, got) } t.Log("AVX512VL Support:", got) } // TestAVX512VL tests AVX512VBMI() function (AVX-512 Vector Bit Manipulation Instructions) func TestAVX512VBMI(t *testing.T) { got := CPU.AVX512VBMI() expected := CPU.Features&AVX512VBMI == AVX512VBMI if got != expected { t.Fatalf("AVX512VBMI: expected %v, got %v", expected, got) } t.Log("AVX512VBMI Support:", got) } // TestMPX tests MPX() function (Intel MPX (Memory Protection Extensions)) func TestMPX(t *testing.T) { got := CPU.MPX() expected := CPU.Features&MPX == MPX if got != expected { t.Fatalf("MPX: expected %v, got %v", expected, got) } t.Log("MPX Support:", got) } // TestERMS tests ERMS() function (Enhanced REP MOVSB/STOSB) func TestERMS(t *testing.T) { got := CPU.ERMS() expected := CPU.Features&ERMS == ERMS if got != expected { t.Fatalf("ERMS: expected %v, got %v", expected, got) } t.Log("ERMS Support:", got) } // TestVendor writes the detected vendor. Will be 0 if unknown func TestVendor(t *testing.T) { t.Log("Vendor ID:", CPU.VendorID) } // Intel returns true if vendor is recognized as Intel func TestIntel(t *testing.T) { got := CPU.Intel() expected := CPU.VendorID == Intel if got != expected { t.Fatalf("TestIntel: expected %v, got %v", expected, got) } t.Log("TestIntel:", got) } // AMD returns true if vendor is recognized as AMD func TestAMD(t *testing.T) { got := CPU.AMD() expected := CPU.VendorID == AMD if got != expected { t.Fatalf("TestAMD: expected %v, got %v", expected, got) } t.Log("TestAMD:", got) } // Transmeta returns true if vendor is recognized as Transmeta func TestTransmeta(t *testing.T) { got := CPU.Transmeta() expected := CPU.VendorID == Transmeta if got != expected { t.Fatalf("TestTransmeta: expected %v, got %v", expected, got) } t.Log("TestTransmeta:", got) } // NSC returns true if vendor is recognized as National Semiconductor func TestNSC(t *testing.T) { got := CPU.NSC() expected := CPU.VendorID == NSC if got != expected { t.Fatalf("TestNSC: expected %v, got %v", expected, got) } t.Log("TestNSC:", got) } // VIA returns true if vendor is recognized as VIA func TestVIA(t *testing.T) { got := CPU.VIA() expected := CPU.VendorID == VIA if got != expected { t.Fatalf("TestVIA: expected %v, got %v", expected, got) } t.Log("TestVIA:", got) } // Test VM function func TestVM(t *testing.T) { t.Log("Vendor ID:", CPU.VM()) } // NSC returns true if vendor is recognized as National Semiconductor func TestCPUInfo_TSX(t *testing.T) { got := CPU.TSX() expected := CPU.HLE() && CPU.RTM() if got != expected { t.Fatalf("TestNSC: expected %v, got %v", expected, got) } t.Log("TestNSC:", got) } // Test RTCounter function func TestRtCounter(t *testing.T) { a := CPU.RTCounter() b := CPU.RTCounter() t.Log("CPU Counter:", a, b, b-a) } // Prints the value of Ia32TscAux() func TestIa32TscAux(t *testing.T) { ecx := CPU.Ia32TscAux() t.Logf("Ia32TscAux:0x%x\n", ecx) if ecx != 0 { chip := (ecx & 0xFFF000) >> 12 core := ecx & 0xFFF t.Log("Likely chip, core:", chip, core) } } func TestThreadsPerCoreNZ(t *testing.T) { if CPU.ThreadsPerCore == 0 { t.Fatal("threads per core is zero") } } // Prints the value of LogicalCPU() func TestLogicalCPU(t *testing.T) { t.Log("Currently executing on cpu:", CPU.LogicalCPU()) } func TestMaxFunction(t *testing.T) { expect := maxFunctionID() if CPU.maxFunc != expect { t.Fatal("Max function does not match, expected", expect, "but got", CPU.maxFunc) } expect = maxExtendedFunction() if CPU.maxExFunc != expect { t.Fatal("Max Extended function does not match, expected", expect, "but got", CPU.maxFunc) } } // This example will calculate the chip/core number on Linux // Linux encodes numa id (<<12) and core id (8bit) into TSC_AUX. func ExampleCPUInfo_Ia32TscAux() { ecx := CPU.Ia32TscAux() if ecx == 0 { fmt.Println("Unknown CPU ID") return } chip := (ecx & 0xFFF000) >> 12 core := ecx & 0xFFF fmt.Println("Chip, Core:", chip, core) } /* func TestPhysical(t *testing.T) { var test16 = "CPUID 00000000: 0000000d-756e6547-6c65746e-49656e69 \nCPUID 00000001: 000206d7-03200800-1fbee3ff-bfebfbff \nCPUID 00000002: 76035a01-00f0b2ff-00000000-00ca0000 \nCPUID 00000003: 00000000-00000000-00000000-00000000 \nCPUID 00000004: 3c004121-01c0003f-0000003f-00000000 \nCPUID 00000004: 3c004122-01c0003f-0000003f-00000000 \nCPUID 00000004: 3c004143-01c0003f-000001ff-00000000 \nCPUID 00000004: 3c07c163-04c0003f-00003fff-00000006 \nCPUID 00000005: 00000040-00000040-00000003-00021120 \nCPUID 00000006: 00000075-00000002-00000009-00000000 \nCPUID 00000007: 00000000-00000000-00000000-00000000 \nCPUID 00000008: 00000000-00000000-00000000-00000000 \nCPUID 00000009: 00000001-00000000-00000000-00000000 \nCPUID 0000000a: 07300403-00000000-00000000-00000603 \nCPUID 0000000b: 00000000-00000000-00000003-00000003 \nCPUID 0000000b: 00000005-00000010-00000201-00000003 \nCPUID 0000000c: 00000000-00000000-00000000-00000000 \nCPUID 0000000d: 00000007-00000340-00000340-00000000 \nCPUID 0000000d: 00000001-00000000-00000000-00000000 \nCPUID 0000000d: 00000100-00000240-00000000-00000000 \nCPUID 80000000: 80000008-00000000-00000000-00000000 \nCPUID 80000001: 00000000-00000000-00000001-2c100800 \nCPUID 80000002: 20202020-49202020-6c65746e-20295228 \nCPUID 80000003: 6e6f6558-20295228-20555043-322d3545 \nCPUID 80000004: 20303636-20402030-30322e32-007a4847 \nCPUID 80000005: 00000000-00000000-00000000-00000000 \nCPUID 80000006: 00000000-00000000-01006040-00000000 \nCPUID 80000007: 00000000-00000000-00000000-00000100 \nCPUID 80000008: 0000302e-00000000-00000000-00000000" restore := mockCPU([]byte(test16)) Detect() t.Log("Name:", CPU.BrandName) n := maxFunctionID() t.Logf("Max Function:0x%x\n", n) n = maxExtendedFunction() t.Logf("Max Extended Function:0x%x\n", n) t.Log("PhysicalCores:", CPU.PhysicalCores) t.Log("ThreadsPerCore:", CPU.ThreadsPerCore) t.Log("LogicalCores:", CPU.LogicalCores) t.Log("Family", CPU.Family, "Model:", CPU.Model) t.Log("Features:", CPU.Features) t.Log("Cacheline bytes:", CPU.CacheLine) t.Log("L1 Instruction Cache:", CPU.Cache.L1I, "bytes") t.Log("L1 Data Cache:", CPU.Cache.L1D, "bytes") t.Log("L2 Cache:", CPU.Cache.L2, "bytes") t.Log("L3 Cache:", CPU.Cache.L3, "bytes") if CPU.LogicalCores > 0 && CPU.PhysicalCores > 0 { if CPU.LogicalCores != CPU.PhysicalCores*CPU.ThreadsPerCore { t.Fatalf("Core count mismatch, LogicalCores (%d) != PhysicalCores (%d) * CPU.ThreadsPerCore (%d)", CPU.LogicalCores, CPU.PhysicalCores, CPU.ThreadsPerCore) } } if CPU.ThreadsPerCore > 1 && !CPU.HTT() { t.Fatalf("Hyperthreading not detected") } if CPU.ThreadsPerCore == 1 && CPU.HTT() { t.Fatalf("Hyperthreading detected, but only 1 Thread per core") } restore() Detect() TestCPUID(t) } */ cpuid-1.1/detect_intel.go000066400000000000000000000006751313655072600154710ustar00rootroot00000000000000// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. // +build 386,!gccgo amd64,!gccgo package cpuid func asmCpuid(op uint32) (eax, ebx, ecx, edx uint32) func asmCpuidex(op, op2 uint32) (eax, ebx, ecx, edx uint32) func asmXgetbv(index uint32) (eax, edx uint32) func asmRdtscpAsm() (eax, ebx, ecx, edx uint32) func initCPU() { cpuid = asmCpuid cpuidex = asmCpuidex xgetbv = asmXgetbv rdtscpAsm = asmRdtscpAsm } cpuid-1.1/detect_ref.go000066400000000000000000000007011313655072600151200ustar00rootroot00000000000000// Copyright (c) 2015 Klaus Post, released under MIT License. See LICENSE file. // +build !amd64,!386 gccgo package cpuid func initCPU() { cpuid = func(op uint32) (eax, ebx, ecx, edx uint32) { return 0, 0, 0, 0 } cpuidex = func(op, op2 uint32) (eax, ebx, ecx, edx uint32) { return 0, 0, 0, 0 } xgetbv = func(index uint32) (eax, edx uint32) { return 0, 0 } rdtscpAsm = func() (eax, ebx, ecx, edx uint32) { return 0, 0, 0, 0 } } cpuid-1.1/generate.go000066400000000000000000000001241313655072600146050ustar00rootroot00000000000000package cpuid //go:generate go run private-gen.go //go:generate gofmt -w ./private cpuid-1.1/mockcpu_test.go000066400000000000000000000122121313655072600155140ustar00rootroot00000000000000package cpuid import ( "archive/zip" "fmt" "io/ioutil" "sort" "strings" "testing" ) type fakecpuid map[uint32][][]uint32 type idfuncs struct { cpuid func(op uint32) (eax, ebx, ecx, edx uint32) cpuidex func(op, op2 uint32) (eax, ebx, ecx, edx uint32) xgetbv func(index uint32) (eax, edx uint32) } func (f fakecpuid) String() string { var out = make([]string, 0, len(f)) for key, val := range f { for _, v := range val { out = append(out, fmt.Sprintf("CPUID %08x: [%08x, %08x, %08x, %08x]", key, v[0], v[1], v[2], v[3])) } } sorter := sort.StringSlice(out) sort.Sort(&sorter) return strings.Join(sorter, "\n") } func mockCPU(def []byte) func() { lines := strings.Split(string(def), "\n") anyfound := false fakeID := make(fakecpuid) for _, line := range lines { line = strings.Trim(line, "\r\t ") if !strings.HasPrefix(line, "CPUID") { continue } // Only collect for first cpu if strings.HasPrefix(line, "CPUID 00000000") { if anyfound { break } } if !strings.Contains(line, "-") { //continue } items := strings.Split(line, ":") if len(items) < 2 { if len(line) == 51 || len(line) == 50 { items = []string{line[0:14], line[15:]} } else { items = strings.Split(line, "\t") if len(items) != 2 { //fmt.Println("not found:", line, "len:", len(line)) continue } } } items = items[0:2] vals := strings.Trim(items[1], "\r\n ") var idV uint32 n, err := fmt.Sscanf(items[0], "CPUID %x", &idV) if err != nil || n != 1 { continue } existing, ok := fakeID[idV] if !ok { existing = make([][]uint32, 0) } values := make([]uint32, 4) n, err = fmt.Sscanf(vals, "%x-%x-%x-%x", &values[0], &values[1], &values[2], &values[3]) if n != 4 || err != nil { n, err = fmt.Sscanf(vals, "%x %x %x %x", &values[0], &values[1], &values[2], &values[3]) if n != 4 || err != nil { //fmt.Println("scanned", vals, "got", n, "Err:", err) continue } } existing = append(existing, values) fakeID[idV] = existing anyfound = true } restorer := func(f idfuncs) func() { return func() { cpuid = f.cpuid cpuidex = f.cpuidex xgetbv = f.xgetbv } }(idfuncs{cpuid: cpuid, cpuidex: cpuidex, xgetbv: xgetbv}) cpuid = func(op uint32) (eax, ebx, ecx, edx uint32) { if op == 0x80000000 || op == 0 { var ok bool _, ok = fakeID[op] if !ok { return 0, 0, 0, 0 } } first, ok := fakeID[op] if !ok { if op > maxFunctionID() { panic(fmt.Sprintf("Base not found: %v, request:%#v\n", fakeID, op)) } else { // we have some entries missing return 0, 0, 0, 0 } } theid := first[0] return theid[0], theid[1], theid[2], theid[3] } cpuidex = func(op, op2 uint32) (eax, ebx, ecx, edx uint32) { if op == 0x80000000 { var ok bool _, ok = fakeID[op] if !ok { return 0, 0, 0, 0 } } first, ok := fakeID[op] if !ok { if op > maxExtendedFunction() { panic(fmt.Sprintf("Extended not found Info: %v, request:%#v, %#v\n", fakeID, op, op2)) } else { // we have some entries missing return 0, 0, 0, 0 } } if int(op2) >= len(first) { //fmt.Printf("Extended not found Info: %v, request:%#v, %#v\n", fakeID, op, op2) return 0, 0, 0, 0 } theid := first[op2] return theid[0], theid[1], theid[2], theid[3] } xgetbv = func(index uint32) (eax, edx uint32) { first, ok := fakeID[1] if !ok { panic(fmt.Sprintf("XGETBV not supported %v", fakeID)) } second := first[0] // ECX bit 26 must be set if (second[2] & 1 << 26) == 0 { panic(fmt.Sprintf("XGETBV not supported %v", fakeID)) } // We don't have any data to return, unfortunately return 0, 0 } return restorer } func TestMocks(t *testing.T) { zr, err := zip.OpenReader("testdata/cpuid_data.zip") if err != nil { t.Skip("No testdata:", err) } defer zr.Close() for _, f := range zr.File { rc, err := f.Open() if err != nil { t.Fatal(err) } content, err := ioutil.ReadAll(rc) if err != nil { t.Fatal(err) } rc.Close() t.Log("Opening", f.FileInfo().Name()) restore := mockCPU(content) Detect() t.Log("Name:", CPU.BrandName) n := maxFunctionID() t.Logf("Max Function:0x%x\n", n) n = maxExtendedFunction() t.Logf("Max Extended Function:0x%x\n", n) t.Log("PhysicalCores:", CPU.PhysicalCores) t.Log("ThreadsPerCore:", CPU.ThreadsPerCore) t.Log("LogicalCores:", CPU.LogicalCores) t.Log("Family", CPU.Family, "Model:", CPU.Model) t.Log("Features:", CPU.Features) t.Log("Cacheline bytes:", CPU.CacheLine) t.Log("L1 Instruction Cache:", CPU.Cache.L1I, "bytes") t.Log("L1 Data Cache:", CPU.Cache.L1D, "bytes") t.Log("L2 Cache:", CPU.Cache.L2, "bytes") t.Log("L3 Cache:", CPU.Cache.L3, "bytes") if CPU.LogicalCores > 0 && CPU.PhysicalCores > 0 { if CPU.LogicalCores != CPU.PhysicalCores*CPU.ThreadsPerCore { t.Fatalf("Core count mismatch, LogicalCores (%d) != PhysicalCores (%d) * CPU.ThreadsPerCore (%d)", CPU.LogicalCores, CPU.PhysicalCores, CPU.ThreadsPerCore) } } if CPU.ThreadsPerCore > 1 && !CPU.HTT() { t.Fatalf("Hyperthreading not detected") } if CPU.ThreadsPerCore == 1 && CPU.HTT() { t.Fatalf("Hyperthreading detected, but only 1 Thread per core") } restore() } Detect() } cpuid-1.1/private-gen.go000066400000000000000000000301751313655072600152450ustar00rootroot00000000000000// +build ignore package main import ( "bytes" "fmt" "go/ast" "go/parser" "go/printer" "go/token" "io" "io/ioutil" "log" "os" "reflect" "strings" "unicode" "unicode/utf8" ) var inFiles = []string{"cpuid.go", "cpuid_test.go"} var copyFiles = []string{"cpuid_amd64.s", "cpuid_386.s", "detect_ref.go", "detect_intel.go"} var fileSet = token.NewFileSet() var reWrites = []rewrite{ initRewrite("CPUInfo -> cpuInfo"), initRewrite("Vendor -> vendor"), initRewrite("Flags -> flags"), initRewrite("Detect -> detect"), initRewrite("CPU -> cpu"), } var excludeNames = map[string]bool{"string": true, "join": true, "trim": true, // cpuid_test.go "t": true, "println": true, "logf": true, "log": true, "fatalf": true, "fatal": true, } var excludePrefixes = []string{"test", "benchmark"} func main() { Package := "private" parserMode := parser.ParseComments exported := make(map[string]rewrite) for _, file := range inFiles { in, err := os.Open(file) if err != nil { log.Fatalf("opening input", err) } src, err := ioutil.ReadAll(in) if err != nil { log.Fatalf("reading input", err) } astfile, err := parser.ParseFile(fileSet, file, src, parserMode) if err != nil { log.Fatalf("parsing input", err) } for _, rw := range reWrites { astfile = rw(astfile) } // Inspect the AST and print all identifiers and literals. var startDecl token.Pos var endDecl token.Pos ast.Inspect(astfile, func(n ast.Node) bool { var s string switch x := n.(type) { case *ast.Ident: if x.IsExported() { t := strings.ToLower(x.Name) for _, pre := range excludePrefixes { if strings.HasPrefix(t, pre) { return true } } if excludeNames[t] != true { //if x.Pos() > startDecl && x.Pos() < endDecl { exported[x.Name] = initRewrite(x.Name + " -> " + t) } } case *ast.GenDecl: if x.Tok == token.CONST && x.Lparen > 0 { startDecl = x.Lparen endDecl = x.Rparen // fmt.Printf("Decl:%s -> %s\n", fileSet.Position(startDecl), fileSet.Position(endDecl)) } } if s != "" { fmt.Printf("%s:\t%s\n", fileSet.Position(n.Pos()), s) } return true }) for _, rw := range exported { astfile = rw(astfile) } var buf bytes.Buffer printer.Fprint(&buf, fileSet, astfile) // Remove package documentation and insert information s := buf.String() ind := strings.Index(buf.String(), "\npackage cpuid") s = s[ind:] s = "// Generated, DO NOT EDIT,\n" + "// but copy it to your own project and rename the package.\n" + "// See more at http://github.com/klauspost/cpuid\n" + s outputName := Package + string(os.PathSeparator) + file err = ioutil.WriteFile(outputName, []byte(s), 0644) if err != nil { log.Fatalf("writing output: %s", err) } log.Println("Generated", outputName) } for _, file := range copyFiles { dst := "" if strings.HasPrefix(file, "cpuid") { dst = Package + string(os.PathSeparator) + file } else { dst = Package + string(os.PathSeparator) + "cpuid_" + file } err := copyFile(file, dst) if err != nil { log.Fatalf("copying file: %s", err) } log.Println("Copied", dst) } } // CopyFile copies a file from src to dst. If src and dst files exist, and are // the same, then return success. Copy the file contents from src to dst. func copyFile(src, dst string) (err error) { sfi, err := os.Stat(src) if err != nil { return } if !sfi.Mode().IsRegular() { // cannot copy non-regular files (e.g., directories, // symlinks, devices, etc.) return fmt.Errorf("CopyFile: non-regular source file %s (%q)", sfi.Name(), sfi.Mode().String()) } dfi, err := os.Stat(dst) if err != nil { if !os.IsNotExist(err) { return } } else { if !(dfi.Mode().IsRegular()) { return fmt.Errorf("CopyFile: non-regular destination file %s (%q)", dfi.Name(), dfi.Mode().String()) } if os.SameFile(sfi, dfi) { return } } err = copyFileContents(src, dst) return } // copyFileContents copies the contents of the file named src to the file named // by dst. The file will be created if it does not already exist. If the // destination file exists, all it's contents will be replaced by the contents // of the source file. func copyFileContents(src, dst string) (err error) { in, err := os.Open(src) if err != nil { return } defer in.Close() out, err := os.Create(dst) if err != nil { return } defer func() { cerr := out.Close() if err == nil { err = cerr } }() if _, err = io.Copy(out, in); err != nil { return } err = out.Sync() return } type rewrite func(*ast.File) *ast.File // Mostly copied from gofmt func initRewrite(rewriteRule string) rewrite { f := strings.Split(rewriteRule, "->") if len(f) != 2 { fmt.Fprintf(os.Stderr, "rewrite rule must be of the form 'pattern -> replacement'\n") os.Exit(2) } pattern := parseExpr(f[0], "pattern") replace := parseExpr(f[1], "replacement") return func(p *ast.File) *ast.File { return rewriteFile(pattern, replace, p) } } // parseExpr parses s as an expression. // It might make sense to expand this to allow statement patterns, // but there are problems with preserving formatting and also // with what a wildcard for a statement looks like. func parseExpr(s, what string) ast.Expr { x, err := parser.ParseExpr(s) if err != nil { fmt.Fprintf(os.Stderr, "parsing %s %s at %s\n", what, s, err) os.Exit(2) } return x } // Keep this function for debugging. /* func dump(msg string, val reflect.Value) { fmt.Printf("%s:\n", msg) ast.Print(fileSet, val.Interface()) fmt.Println() } */ // rewriteFile applies the rewrite rule 'pattern -> replace' to an entire file. func rewriteFile(pattern, replace ast.Expr, p *ast.File) *ast.File { cmap := ast.NewCommentMap(fileSet, p, p.Comments) m := make(map[string]reflect.Value) pat := reflect.ValueOf(pattern) repl := reflect.ValueOf(replace) var rewriteVal func(val reflect.Value) reflect.Value rewriteVal = func(val reflect.Value) reflect.Value { // don't bother if val is invalid to start with if !val.IsValid() { return reflect.Value{} } for k := range m { delete(m, k) } val = apply(rewriteVal, val) if match(m, pat, val) { val = subst(m, repl, reflect.ValueOf(val.Interface().(ast.Node).Pos())) } return val } r := apply(rewriteVal, reflect.ValueOf(p)).Interface().(*ast.File) r.Comments = cmap.Filter(r).Comments() // recreate comments list return r } // set is a wrapper for x.Set(y); it protects the caller from panics if x cannot be changed to y. func set(x, y reflect.Value) { // don't bother if x cannot be set or y is invalid if !x.CanSet() || !y.IsValid() { return } defer func() { if x := recover(); x != nil { if s, ok := x.(string); ok && (strings.Contains(s, "type mismatch") || strings.Contains(s, "not assignable")) { // x cannot be set to y - ignore this rewrite return } panic(x) } }() x.Set(y) } // Values/types for special cases. var ( objectPtrNil = reflect.ValueOf((*ast.Object)(nil)) scopePtrNil = reflect.ValueOf((*ast.Scope)(nil)) identType = reflect.TypeOf((*ast.Ident)(nil)) objectPtrType = reflect.TypeOf((*ast.Object)(nil)) positionType = reflect.TypeOf(token.NoPos) callExprType = reflect.TypeOf((*ast.CallExpr)(nil)) scopePtrType = reflect.TypeOf((*ast.Scope)(nil)) ) // apply replaces each AST field x in val with f(x), returning val. // To avoid extra conversions, f operates on the reflect.Value form. func apply(f func(reflect.Value) reflect.Value, val reflect.Value) reflect.Value { if !val.IsValid() { return reflect.Value{} } // *ast.Objects introduce cycles and are likely incorrect after // rewrite; don't follow them but replace with nil instead if val.Type() == objectPtrType { return objectPtrNil } // similarly for scopes: they are likely incorrect after a rewrite; // replace them with nil if val.Type() == scopePtrType { return scopePtrNil } switch v := reflect.Indirect(val); v.Kind() { case reflect.Slice: for i := 0; i < v.Len(); i++ { e := v.Index(i) set(e, f(e)) } case reflect.Struct: for i := 0; i < v.NumField(); i++ { e := v.Field(i) set(e, f(e)) } case reflect.Interface: e := v.Elem() set(v, f(e)) } return val } func isWildcard(s string) bool { rune, size := utf8.DecodeRuneInString(s) return size == len(s) && unicode.IsLower(rune) } // match returns true if pattern matches val, // recording wildcard submatches in m. // If m == nil, match checks whether pattern == val. func match(m map[string]reflect.Value, pattern, val reflect.Value) bool { // Wildcard matches any expression. If it appears multiple // times in the pattern, it must match the same expression // each time. if m != nil && pattern.IsValid() && pattern.Type() == identType { name := pattern.Interface().(*ast.Ident).Name if isWildcard(name) && val.IsValid() { // wildcards only match valid (non-nil) expressions. if _, ok := val.Interface().(ast.Expr); ok && !val.IsNil() { if old, ok := m[name]; ok { return match(nil, old, val) } m[name] = val return true } } } // Otherwise, pattern and val must match recursively. if !pattern.IsValid() || !val.IsValid() { return !pattern.IsValid() && !val.IsValid() } if pattern.Type() != val.Type() { return false } // Special cases. switch pattern.Type() { case identType: // For identifiers, only the names need to match // (and none of the other *ast.Object information). // This is a common case, handle it all here instead // of recursing down any further via reflection. p := pattern.Interface().(*ast.Ident) v := val.Interface().(*ast.Ident) return p == nil && v == nil || p != nil && v != nil && p.Name == v.Name case objectPtrType, positionType: // object pointers and token positions always match return true case callExprType: // For calls, the Ellipsis fields (token.Position) must // match since that is how f(x) and f(x...) are different. // Check them here but fall through for the remaining fields. p := pattern.Interface().(*ast.CallExpr) v := val.Interface().(*ast.CallExpr) if p.Ellipsis.IsValid() != v.Ellipsis.IsValid() { return false } } p := reflect.Indirect(pattern) v := reflect.Indirect(val) if !p.IsValid() || !v.IsValid() { return !p.IsValid() && !v.IsValid() } switch p.Kind() { case reflect.Slice: if p.Len() != v.Len() { return false } for i := 0; i < p.Len(); i++ { if !match(m, p.Index(i), v.Index(i)) { return false } } return true case reflect.Struct: for i := 0; i < p.NumField(); i++ { if !match(m, p.Field(i), v.Field(i)) { return false } } return true case reflect.Interface: return match(m, p.Elem(), v.Elem()) } // Handle token integers, etc. return p.Interface() == v.Interface() } // subst returns a copy of pattern with values from m substituted in place // of wildcards and pos used as the position of tokens from the pattern. // if m == nil, subst returns a copy of pattern and doesn't change the line // number information. func subst(m map[string]reflect.Value, pattern reflect.Value, pos reflect.Value) reflect.Value { if !pattern.IsValid() { return reflect.Value{} } // Wildcard gets replaced with map value. if m != nil && pattern.Type() == identType { name := pattern.Interface().(*ast.Ident).Name if isWildcard(name) { if old, ok := m[name]; ok { return subst(nil, old, reflect.Value{}) } } } if pos.IsValid() && pattern.Type() == positionType { // use new position only if old position was valid in the first place if old := pattern.Interface().(token.Pos); !old.IsValid() { return pattern } return pos } // Otherwise copy. switch p := pattern; p.Kind() { case reflect.Slice: v := reflect.MakeSlice(p.Type(), p.Len(), p.Len()) for i := 0; i < p.Len(); i++ { v.Index(i).Set(subst(m, p.Index(i), pos)) } return v case reflect.Struct: v := reflect.New(p.Type()).Elem() for i := 0; i < p.NumField(); i++ { v.Field(i).Set(subst(m, p.Field(i), pos)) } return v case reflect.Ptr: v := reflect.New(p.Type()).Elem() if elem := p.Elem(); elem.IsValid() { v.Set(subst(m, elem, pos).Addr()) } return v case reflect.Interface: v := reflect.New(p.Type()).Elem() if elem := p.Elem(); elem.IsValid() { v.Set(subst(m, elem, pos)) } return v } return pattern } cpuid-1.1/testdata/000077500000000000000000000000001313655072600143005ustar00rootroot00000000000000cpuid-1.1/testdata/cpuid_data.zip000066400000000000000000010341101313655072600171210ustar00rootroot00000000000000PK AuthenticAMD0000500_K5_CPUID.txt\0HHRv!ACvɪABͥr'[01>}e( 9Y3?8+=|2{Fs Rwծ>3# !wZ^~RX,\%QHܐY|\^Ha[dC]o?p(>Jo%%?ޚAZhv+Ϡz8 iƩ *-YFfrԙ&L;+);t,F^Q &)BH:hpFXh&a.om`?.+ *<ޢ}D| -|;txW4]6zPKgpY dPPK AuthenticAMD0000501_K5_CPUID.txt\Q0##JiمUQͥr'-Ԙn27 'ԃN2SZU ϡ q{TIgf.Y'Թ_ ^zEU \'es!X~ q)mOy&>wnNǺ:3]զIkvjwfRf'Ӻ1X>(]g2(,57wuq)SUU騉zνTdc|p84̢kVw__͢gޟP a+YZ!aO>9c,bXPO }&&߈5ם|">coE,1 0jA.W $jU2^["uFlNO)e֪8*#G@0Vy5 PKPK AuthenticAMD0000514_K5_CPUID.txtSO>#F]v%@DEP],Ih~6lHU4ߛ<3ʴ%|mOL4bUϻ;`.iLs ؀J$^C$E_ENG`4=O?!^؎bGY>IU!|4"YVN*x)o&: aeIU+R]텬d4;sq1c=*X(BuЅxMPl78նP9D+n-!y.vi³F?7gYryr;äPm+_,}974 ['tmG=FmRRu,wQw+}y{R Z6I{y-@uGfہ[KЕ/P4b~rk!wf[;`i2m9Q&6Fؽ6φ8/T0RSe+Q%?RFBmeJ&n~~5jg8yBdQd&,ƦIk; *49KҠ= x4DћDnDDb I$  DypC>J PG" "D&(X-avymy^351gtvg9G)_aʃ2ҭ-<GUySޟPK6 PK AuthenticAMD0000562_K6_CPUID.txtS_o0G;M3c3ACLQU=XMXd`t~2²M=|uUg݉Ϊ:*U3!f bӉ7ufL] Kz,Øm_M-^}H>nL-| reU16Ixc񘕻a~_aʲ4r { K JR[$M[=ycrOU eSUwC(`LMtbF|d8A`j[_ Aùb`aٻ=0D-ֵBmݔ'οj ^[}8jwVyڦ˭ֶ?6O SUU8Zg&˒J}ܣ-[(šR?['s̵QWBҽ̓d`ezgrU'^&"?t1<Oz-JipL".+`BN@Zv"![ Ax^['"n`YcZ7[L蟭.W "Qiהw 7:o?PK2P}EPK+AuthenticAMD000058C_K6_ChomperExt_CPUID.txtSAoL[O%blYEz@dcbp%u뫅`UF̼yfvHcA*+ `˭N] |U;f8v&L.|c>'Xeۼ͇i­ tE?+>vuYR1hTFM9F}m,*F`aʍQ.!fj lp:H[5DH ٘bIt쳸uh!$n9x cH> /@0l17y>fUfonGp˯#OA㵐EcivGH>i MbsHGA\TԩuWڶ񗀏 I <~T6NDmYzȮܫ>D.W0e4]R?gr̟ppSu]R7 |9M[%f-(Y-a7Yepiڼ(ڸ;TύY"}k d①XةX^~$ SWY] PK y):PK%AuthenticAMD00005A2_GeodeLX_CPUID.txtAj0 ?w#y$مJq^j07M8|&tܨQ$Z2}|19 PvB2)`jZb&`ppsZ xIZdxdDOs$KQ ioi7dG=/W WA:/a1}PKatPK%AuthenticAMD00005D0_K63Plus_CPUID.txto0ߑnKGjҴ(sK6H:' 1mN}4 -"/s2 s[^w2^\t/-+44bqf>!<$˾nYv%W\ N \s*="T=Z%9GFdzNHLq"H,iH$$0@< A əbD19SiwgE/b>"H"CƎɉH%QDD!Y!p|)5BY3 јg/^.`a2GmLB?hDy9u䩙Y6y @iQm>ab6eVPKȉM{ PK%AuthenticAMD00005D4_K62Plus_CPUID.txt]o<#;GMR/4REIVMv۰}Rm":߿OF]|*kܯgJWO:)=!xf /re{g U;yw7@,jX2`ֶ M,#  b^ʓ(T7ՀϢnt6F5WՏS" qRIڴZin*,PbpI-hKEtPV/Y׬`s$].vi,Mxڶ$և$Ͼɞ1FT0j#J6wg'"h L{"w$2qVljh 񳤥!yDw@tG$D L=Ꝉ8AP8=:vU#1?Or157H_Q(Lg/ެaQ'l,;{?IBP zR*{=v~-=lUtb> KY[gPK`! PK&AuthenticAMD0000612_K7_Argon_CPUID.txtA0 Es_@%˒xu_Ĥ T`x ?=4?_^& Woʤ]*j~`,4|BpNÉġ㗝UGu/JT?jdYt99Xzzy:'G;("A R@ɱ , ,yPKreRPK&AuthenticAMD0000622_K7_Pluto_CPUID.txto>#~/GgclԇTQU= &L20]~r(y%wؐO{3G˪VɾˁSxSS* Iƣ{]|\9E[/(!m^<anvyYL@?p#."޶y%еSNt[2OsYςu^ɵчCVl{&Em&5ݵ6m 8cBsҕ7f 8$nU.N/iԭƣs+7P;m& ?yzh|xJaKBD(pCNCLr D%]A@=G͔Lޙ yI*)5a[8%3ODB/LPɄt>"/L<=6&)QzJQ$!}pa!5D6]rhzE*V;L"g+{>"ժҿ]p+g.wbsa]% :PK7 1PK)AuthenticAMD0000630_K7_Spitfire_CPUID.txtQo:#;Jut &H}H֍T*ɭ&M{`t>P 0KHG>q6>Ó6M^ |vT{}"Hu3qQpNt^7c3/3tzXjLq{Zð"X1ĭ 8E,"Wزsˍҏt}]zcu]~t*k̺^7v@~?~~sbHUTf[Kg4%+{Tn~Oc0vcz껺O*Nq"13 D5>o6KtrzU=L\'Yi0 G$1<*q'TFhu-,pz>(wkhN~PK4؊-PK,AuthenticAMD0000644_K7_Thunderbird_CPUID.txtk>聾*lYv }Hc 4WM9v&]~Ȯc7CGwL[3GK]nw9!~Wz/lqB2r83QD#HkIH+XmV߽uhd+7@$|37TZU-?g{y- U^eu5 PKO4PK)AuthenticAMD0000662_K7_Palomino_CPUID.txtok>ǟIˢpeY1 %Y)=xsvOև8qz8|)ey_/p(u] <e9)tΓMp{z`r1J_|yX)edL&+rxX2D>+c5P-0RU ,TVlӼhËLՏE="kֻ]Oxg8U]6Im&uA=_ }yʛGMKS7:d]ݩ8݈puhnyK7f1έpphfb&*U%ƃ{1Z"zG .sF c,`ۄO\CU9DN$'AIEOK$K%,tKsz&=+y'њh3;nB["d(DAPJ!ZH9QD#HAr"D+кxx KNZ8@fmս0loS|4>u)(oN'Zgnv܉Uϰ۝.pΪPK(LPK'AuthenticAMD0000670_K7_Morgan_CPUID.txtAj0 E|ɲxnz0tuK y dMTuSJ d:{BK t`WOM+>1I/{3YxS%\%F.,T{jͪ%.^+HMC("AL) ` dO&e`g0PK6YGPK-AuthenticAMD0000680_K7_Thoroughbred_CPUID.txtQo<#?VI-RU]06ݯBBlH><>&gWUE _'pMo5pW~g>8M`t<TmuMRG/?x*lSp.LC:#Zc^Z50 Y\iY&ZG2mEʟ }ƒ0.8M*T:KI .ު?^5<,{s?Vfpp,N=\uծ[n$.ﺁi]UYާg8,1mvctO > ʟ Ý"()ڧ$mZ=Cltd4 KKf{ )S]ץ髗9ۍFG7Eph:iߖ,M0윉PIs"ə'B"Dlr&r|p#AL(< .\zD)JQ$!L$H"AcE!NĐtx KFG& u'* ĺؒ9"Eq 2tEv6.$E?Z]p+'.wm6yV$~ u^gm=PKnPEPK'AuthenticAMD00006A0_K7_Barton_CPUID.txtMj1 F|̮nz41nms+rGV6cWK3y}{xty k!ţS(kMK+,EpL15'ŷAҥ jU c{E̥"AL `A1/Avy8te0 \ۻ~Ȯ[!@`}?+őI~'[iY[d>2y?>DOC{/rlA5JXg+[$b^ԻMR]ܳo C !hYY7@5"lo%C KM=יzkVDR;ONy楬rW&N]cx= nlSMuLWm7n@_n˯nknBؚbXmmѤI {lr \55(Uغ.7!02v^O0" GcrA<*& =blzl58A҇8F:cȐs0霐:A7> đi Sh= @(Q)))]>!k>H<)Ē1 )Btuc|:΃;) .OTN{4KX78]~ZHl\?H'[J!ܼ2 OYPKnh PK-AuthenticAMD0000F51_K8_Sledgehammer_CPUID.txtk6K Q8epڦ.4]=WM9v&;w8L ͉bMx4L1ɶ1Z?7Jr)uGs]oC @Li*\on3,~{p*w-CiWkS ' Í o[xgIusvM+YIZIR|Vn͝hQT٧Zmݻb&\2'ZyEˤؿ&i7@}:Kg˰XVφ}SooaeTWUi$}a[֬J-ƣ&)^` lFoǣ4CS!YinWdi71t9ɳ.¶ctgRyĥäۃi\ :SxNmNƠ ":8-3z!L(LeQrd9#]#zKJ=t z@ca()Ả}'N%{j!|L%N}h6@( C >C g4d?qw$@>%K3{Ӈ t($ߥO?&pq۟pM!4d?]@GxԛuVwSG2ٿq2[ &沸I"ձu~/C~&;m{/p*W?PK=WPK-AuthenticAMD0000F5A_K8_Sledgehammer_CPUID.txto6#8^Z)X#5wUU= l _?Bخa (~91m6uV52g: 9zO ֺI泵.ӷ[w<ߞ5\Z]?m8pq8m,>/}6!OI ;cV.;a>ۖucNic{Wra;&i p՟-`ڎnC%5I&ujtdjk9)i[x0U2 =dt | MR6 ͠GQZyRW,Mvp 7 @caѡK08}7k7 >'1@)P8@)3S w 4<9b $@W1w-rO̾Hqd'A!nՍ6Ps>;)J6/QN9J1&ZI?NL'p V[Ó.$OyPKQh^PK+AuthenticAMD0010FC0_K8_Winchester_CPUID.txtMj0 }wϒ,+5JS_?=R"%k"UL֢vX~% qϦ[J>䯚\\!UimaLV-g!v;&VHŤA֊LŒ. H{5xjч`$ &e!ы2u@~C=3M#=.T#舠@ "#H"(rR 4"B?PKTAPK(AuthenticAMD0010FF0_K8_Palermo_CPUID.txtOj0 w$˚qu_Q@ lmyVv-&dvX*ߨ /GܐߓήBJr{.$Fsgjn aј|tBXPAMX%1 / Ս"(1`}4$e`^$ͯ'鲒4 3A= *ȠAAAy*5,iFPKӚRPK+AuthenticAMD0020FB1_K8_Manchester_CPUID.txt]oF-?7|2 ZVVz$f뫁`{i"\Gb4fѐt2JvxG9U4t"݆776s&9HK WB-,C"ݚ1U'XIXV`S\vMcx: $ɲ66tsZlGjee]3۝y?xp/CyHA"Tq\GHDOGځF$0~qS7NU'Y8x_qb0"X/A#V W =Lj\E)CbHd@IU00;#לn8q^$ڋTH `"Aođh[N{b 䏁1P8@H]~\bcB3$ %Rv•@dp)p)* js )Nv/NkJ(B$#D0(CEP&0=["5qe:"KǕBZnoĞ &C=PK["PK(AuthenticAMD0020FC2_K8_Palermo_CPUID.txt]6͠bt8b i"BQQiA 2;%[>絏1ioӦΪ߻hp[gg Iƣ.Ct@g|F;CXvcoG *XGSSp$"> ^"NJğ:1ϒ]'6E;]f&UNΓ2E/O݀+x'}Q|YSM<=|%yv.-\ yɈ\.C)n 3(D҇AWͣy!;u=G>p8,`q>P"e `*ȥ"d $2rˤ L2Jѵtΐ N>D*[IQpK_:7rVb,{wbH{pz=C(Ch! O!=u+8"((< }*/*Fﳺ?vpNkJ0DI$z }2Ցt~O .bGVGm'@XNxoPKOPK'AuthenticAMD0020FF0_K8_Venice_CPUID.txtߎ6#F6t.:6QHJU/Mh @}MRf3^Neg%ƣuخ .LԆh??ZϨiPgj]/^󾋾8)+!3| ax2`ITʒXA0QӨz͋cOUA'+u:%پ_IƣeVV9tw[LDV_o?L! zKVQv~\BWw*x[ķT' 8l[RN!"E)0?/(~n56ʶ L͚O9'q[gi|:rK_onDLnι p,.a@Ƶ6R߰4h Ω ''W Dxڋ  \'`Bb!CFx=hw d %"R(45DwNH8EAhk'} Đڏ2@btf`2j;Dq"hRnr;&V6j*ԦDtx_kf#A%`P =UVJ꯳̴ZVO+29ѿPK- PK(AuthenticAMD0040F33_K8_Windsor_CPUID.txtMo6%AMc!.Eʒ+ɻ$hV=B3ϼKv w/UX%] xq _PJ 4MH.76CCv*'届}v}m06I>)+YfHy~>kg0/\P O/A \q%q?.+IPV}tQ_Ls ƬYO#ѼߛuSmRXŞbfIyHfS o),Ϣ]]u2[r ZU.# ܘY" Ԝ/=[|J{F.>Kg/emn<0xϯ,+_x;Dғ\jIs\XH E5}B" De]򏠷&= L[Jw(G+ (M@Q(...]|O/ cv @ U'5ncV7zvNNHpdؔ}fldPZ!ۿWܚT=@6u_PKR!%,PK(AuthenticAMD0050FF3_K8_Orleans_CPUID.txtQj0B$UJ-*#/fIQ́rDrS&y D!eʣmK 6^P5N4f&MILjK"Y,M3TZ1Iu8|P" ?ÁKG/6xtdXB,@ x';׶Xcb>|,X1y F +C'PKu.PK)AuthenticAMD0060FB1_K8_Brisbane_CPUID.txtKo6%AMc% ؃^# =Z&VkK.%f cꐓ Hh7G[6MYW &_|Bvd[*T ĺ͇XW2ņb<6ӮJ2>b~h8mJj!U]𙍀QD}.(=xx sɢU7bS6v*ok޻un!1hfSV#ӪiͶh :c GFly<2"n.4Y^mm h.uՖE4Kw!vZ??HpѮ/ @)47u6GLS_ˮk. "JT1]6ߵɫ/0M?HXkr8KZxǍp ~vUنp/Ov w%2 J9̤wÿGah d6 XJ`_Y4xCJhUsdq_B`2Z_@fR.LO g^ " H%8CJg'AzK33|s‘#t 䅠"J1V<* $}B";uGk^ ,x*MP{xJ>PR= } b} } $@oAAʭ7B yy; nCٴpN'*ːf!}b~dP"XbD(Ä`K6ؒWVFU>É7|:[hc|Dr PK~!PK%AuthenticAMD0070FF1_K8_Lima_CPUID.txtA0 w^@ ٲf7-lWӂQ@D>o_ߟkwbZ+d4)A#Ew!Mˠ#&uUH mERZ. A YPӀrGIiJT?PY.h=a/>@ymGo(jqdu`eׅB"47A*)bVfPYJ F(cD'̈!3RZv&2L!@z[(Zrdu )D\-H)XGr;lAa IwLh>0-h%e(M@ı Ļ@k,[}e .P]7 4|'{olq{0!? 9LH&$6L؄NaBqL 2!LH&l=2! „&dB2!L{dB2a: 1MȄdB2!Ȅd&t 4a@&$ Ʉ;G&$6SPӄLH&$ }LH&lB09 LH&$6L؄dn|]8߸zZ\V]tuliU_TrLY޸, ۡ<إs<Ý[Ow.b=߬PK+wl;PK'AuthenticAMD0100F22_K10_Agena_CPUID.txto8?^:z69J6jjqSvd v_ vr\@[|Nf(Mvz3L'Y΂M3wo|&pFBtI\^6Z ،ϘnPDY^Cڎ~J8<Y_i&~I9&>P !UGkuiُb6J{sCl:HvyVZJؓ)UC?4*sXܲae-AR<a^d2S L(}\l;&(2S٭6F~MĈcq:/9ZK?koe .3ۛq-, K[`XMO'4sJ8B#bnp C9D8'0zGRڗ:=H ɾdֿ[uگ(D Aysv!jY0ub0 ]z#=H@W+X\o^ xGT#2ABQe)ǐq:= aVZO~ӑ!{ѣc=h1$r !78C],5|OT!+c-P{#t@^2 G'pt7:]W8!{O'dN8:{ot ЯpB=Ppt G'{N؅ uewWpf > 43zZ EG8TtUi՗u\e$!cPIԛVHʵFR7f[Yܪh["h'>Hg$tvZ+T;?6ܫVot.*܆{1Rю"%IQ,OޖPdZfL&2o!;|M7:וMrY.*vPKEn#!PK&AuthenticAMD0100F23_K10_Kuma_CPUID.txtM@ }ށ Xc>`J5eKF1UwDD ׏e@}M(PR0&3[R5^ĀA`$Nw^ =zPx {r<Ոo_^EżɝV_{4_8ZƔLr\&qiР ND7gӐ4 (Iw0 wm A\ PTP?g܎(}~s )JGt{*=hAkA܃MMMB= 4NCO/C 5_kZkZ+ڵ^\kPK9f\ PK+AuthenticAMD0100F2A_K10_Barcelona_CPUID.txt_o8#;WM+?i.HMnTb6;fӯ@L[.#rcs~=|z&k\,}e=[~HJ6`:Fb,5b:N(Ž+ 7iipgu&ƅa_Gl!^Vs"\5 HiV7q?ٲWC_LTyWE؈[2qdg(/1y5U)`6 1W0eʖpdF&8n'ȝyXpw(rBIȗp^ӬnE{ 1`pPL+EdajܝN.: :-v!ngp?(?{j0^|kpw9u"VBY!'D:&>mDh#CI0 5 :cj%Mz}E"vN"ժ31TY%@p"Ci"`(DbRHO fK(f!C6&KKrٍ$`XPpDa gogA@TD 2bd?R˛KqdW&e?ˑMncGǨ騎i'Ҵc&}Lmegz[aٙD$^>>7)W.$$!5$4$4$4$l=CBC¶$d$!3$4$4$4$l=CBC¶$$!7$4$4$4$l=CBC¶$$0$4$4$4$l=CBC¶$NIBːААА] ۦsPҐААА] ۦsPʐААА] ۦp6[X:[w?#i.>2/#|z44b/t=ANw/}>*$)$ŝ([Q[CeW=F%UhEg$JDT$Hm½=p%RHbW*jfSWRHHmR{/Tu$Uj&槏E>$ڒ<jSV~]&2F'wxWLknN/W: M Lu^lPKE =PK*AuthenticAMD0100F42_K10_Shanghai_CPUID.txt_o6 ;MQ^ؖ,ΊA/Iڒ']O?PSnT P@F|<+깅Xy~߻*"Y6cB!g7  $u{cwml  hfjL.ߏb|]ixzB`&4 iJ]0"L~3y=h&yfIv")b4?T~QERViv]Ʉ{ٺ,6dbz1!R\t}.`6U-Z1B\F0M]2/7. Ѧ|YGӨoy,+L:H;g|뼨دڵڎH`JE}˨l?.cl;Wm~ߧdQ-b1_mB,OݿO<"_D *9C_Xz-}ZAD"A ! +2]$}2.&1F ?0m_4[ZuU5 sZ俼T [6q--_thL:픏Dt1E]Lq`D~lM?WX&u1.WܧCS4 A!%ט}}5&U?\3'utttççm:|c9|:|:|:|u6 >1>>>>iNvstM'O>>>>iNvstM'O>>>>iήZߧRo|'|2Ypӷ߬ћ`hYj"@ufiHphH&VSKb.%ZFK<{ƐPbKKǬ@Z >WHID$&HcJ!3M&z;$S )-;X6R̅*`??12f}E?Rry&慂܇GKࣀIO%+ 8"Z t;Nh߭2iL>/E?sQ,JZ%Nq5!S6̲uYl*BّgF8p"3X,ƪ;b\0}BxS>Lܯ%z,RmGRry+.~"`WtGF]+V%YvCGi5q4Wn4:tla[!/DZ}AD"At!$a bLZ.UCm#:9[hT;J0$ABl!C3}JBb H_D +=r p䂻 mf!CbsKK$L!l&#,cR$&`H"C*^$LLCDoV89n r đ뾝 zvA{q']2M@~( ] e }D.!t\BF"x >3'z9}>{'>{l{}ل~di>{yga쓿}>{goMl\d]b=M N.buz1=ho2Y*<ȤVA]=*-VR#O~ސTs5sCt%K`"F%6o$Is-f<ƄO C V?5VSnц[JGV[+wډ4ZTpvk63RPڨxmBvU9jߞZ}hCBgUU{IX{ |6yGe jRETn auYPK@\y!_"PK+AuthenticAMD0100F42_K10_DenebTWKR_CPUID.txt0 ¾C^@[e;IS*K6ng0320*TQ9:}[HK$4,z  0P)b!w־Wt( A^ PiV5vz@ᗽSft5^CeQ̽ %^kp>K0gL+`SDX\P1 r&q=tuM)2[} ^ lyxl<"߭ .W[](q+M` ʁ#/G!>,t]sp/:-╻YM*I(֗Dmv[oÝ@D*2RY_a E?×QRڤ2}.{=ǫ()<,q$΁(54$ʶ%%B_PʼnZBJ AD6"A!N Y8 HFуH6h$Nm DPU[aH燉!3Q%(UB" T=;) ZL"Cbq+xU",WCҁ0Ie0$TуSeAhSn$pڃ {ZHߋ481=zZ_ِHCpDqD@?w,5$@r@'Oǐ=:"$@}IGXX]'II>>޹}g/|Տη$[},_Gɥ~Й_zGS]Rě$ֹTLxdU᛭!a Yxe[iJbs# L`ntDvHCIPYJxNjboHX"NLp0DMKG+[UZ J+)Wn_>#g.V^"2"UY2w{\L R@HPY0y,SPJZ]wWk0^We$no2^X?*|>Lf`s٭ei4%BOPɉBA6ѷh!D ┠i͂Y v=` ?n,: -r < kDIYҗC6)zG.8%kD&74Lփħ@ A1(`H"C*FjEŻ̏_dGӲ489 z7:ŝ !? @@tK}@C5@rt~:!Ԇy-x tOHDK.]Es:˹[iPϺ{muXE3nE/pu0KzM-IX6xՙUR%#NXKܪcZD ao~CK;Ho,ڕH~EIDM^"8]A|v5Z- Z94|7pe6 F ,L-K.KD]}3a7qWEc=ofim8|2sYƅY.ǭw/nz*ۄ<%/`4D.0/^:QX?bb譋'((i$v.ҹi:xtsɳYLN5UnDC|vgGNH'1W;d'#|> O> dɏON$|> n#|>]SI$|>ݺG$|<&>%I$|uItM'O O'ӭ{O§k:|c3$|> O> dI$|uItM'> O§[Ot2>I$|uItM'Ov O'-|Ok:~C I$~ItMe~Ʒpkl e˿$J2(ҜJbx#)ZFJ|wH]ɰjq+QHg_ YC O -{A|pVJ+% .Tm_KC9`_l2{?p+^IvZo9on&r'G?㼘f1o@AK*3bx3[M׫nPK{\PK(AuthenticAMD0100F81_K10_Lisbon_CPUID.txtj1{K{4?ׂB!JMߟ"{dd8/PFXޝ͇ǧ篗?Ͽ_ǧ|t_eMHQkDd؄9J8_ED('k(P"2DllLk^s"wݩ\EqK/\..o+q{ iS☳9ert&($1#7-J2.x2!Ga(:#U$׃weʙ)gKpdȑEk#|r;${:{(6XHZ"6J-ѼLw)[xz5 ;<1_brSNg4J޲OϟDwz5J˩ xqbE}a_ӱvqٿ'n?{ Qdw^E][v:D[KtiJC%-F5ӨF-O-Qnn%S'z;]'_c!b! PGX8`!b! PGX  uX,XX:B,Q&,B,Ba!,T<.aFB$DB$"OBCXX:B,QNXX:B,QXX:B,Q`!b! PGXb!b! PGiXXh",Bu`!H DX:Bb!b uԁL#B,Ba! FX&B,Q2  MX,d)b! PGXp9|==JY* .=ڧ=#xgߟns8bӥFBo:0W3PlzC͗?m9]CohU%0L0KjxLo-vE0SI}$ 0Cn`6M,=A:؃I?d\쓥&`}/ds]Lhv(.;mnW"`nG;A _nTZuyGEN,s^/.LQonn̗ 1\y1-ZҒm98̒}K_Woi )b"3 ApL)tqK Q@A'3y [D/# cub6ǔ@ԑ ,ާH; L "[L0d%LXRH&@f6k. he GHqImq,CI7/g 'A ى!skO9hȴ vٹsFFTh)9{cSXEҴ#ȏnThZ*~ ] Vvޥ g* a6O*} zﺝPK(]4PK)AuthenticAMD0200F30_K11_Griffin_CPUID.txtQn0 Id'x+K{P:*rV/ xZdΉ ye2f* *F@:.xߓЎAWaԿ]]`f 7ev.WhϫhQW:`HSqeQvkv͏u17" V_wq?ΓrNm#mý2Kj΀vLA7 O0qt pEnd%4oi.v2dra|޺0 ' ARSc1Ϟ0-Im JBu " Th !Vݠ+"%@Vܥ0"#He?E5A1.Op;H?y9{\`L8g>WahY zq̪cD I-Ɛ0%2a.;̞PRDK.s\Sj0$!{fOM@̤\ **A'R#SU_vDdzc+ zt2CaqD]@K%nA?׍2H\Y@?jag1.DZ?O~y :P^5tFi-Io"ɬFIn$ p^Hr#U藑dVKٛH2m$FIBu;\6Hre$גd&In$FPW饍$7\˒9{F^򭴑#i>r N'¬ӓ_S`~>Jgd8{2::JKo|U.0eS^}! xts:kL y GEU\4VL)̅&Ŋ9 5V\,.b"Y,H]DBR"T&ɸc6S 3J:dA92 =R Y_ Re]p٥H՞:奔G* ZG J' E }[P<}#!TaB7uX?-RМ$E!IHhDg 1#bFfRm4k/ڭAă m`BP߇B+jJ)D3`}+c>פDHQXhߠ0t uR׿Qի轒W s/w{Dr  /0b"̔<3=ӂ);z2=hك́=<#^kߟft% x5̺]u9Ovy}鿂jhc:yW L@[iE Dc3( d5 [3L/bzX'bH:{9' Qx w(O//yFD ˈSC/|.(9@ $<)y(ub,_ߋ3[t6# \ViA4HAPF-;2't4wM-OѠq?72& 1kL1h5&f?=7&PK镖`LPK)AuthenticAMD0500F10_K14_Bobcat3_CPUID.txtj@{=,~$7cM >^kߟqt% x5LgW}NS7h^__A~5C协c41zk|+&ATD `"S&Y rᔱ;L'A1or˨c_X'bH:{9W69q@;wz T Tˈ<#T"aDPK @#gH';?.P<# ͭwE׍PViA4HAP=2Z4HO4h6ا[5HOѠqDfʘ'$1kL^5&טF}znLPK-bLPK(AuthenticAMD0500F20_K14_Bobcat_CPUID.txt 0 ``e;$Yܚ&ʠPƮ C[ ͋9sw{5ߏ?گ_ Lhgg ,aB@ ,DHA"h,iZ Z2AP Wx>e =B W(劣"^^FEihyUKڻeD%lwL={끑A|əA3+*^XJ >#5b @`I#1̅eM 1V_-Wy (-9@:,$^܌7|8!63aAucj2kP_a zo7(#Amma FjOhf嘤I>&1{}Lޣ~PK1}JPK(AuthenticAMD0500F10_K14_Bobcat_CPUID.txtoFߑFK"eO{0P z݃l7ScNW LΝOdY9qS9h:\=U!v;&MAj}ܱՍ70y8X6r3?"?qa꯶~n:ngJ㋿ YzRyقJDQ|v ;0W0q3?e=\eѮ"H굹_) (/~~f~?i@39QP,Ai)lKXRP"pU%XD_ "Ca#c'Բ2e6,!QJ*1H@vPzhޏ\_b`G&\r\!$2H, eճ,~F H|$yh<%̼Td3F/`CPTd !LԵt9Tŵ: d6и 䵀(hcQ}4*66{GQtm6:mj?y9_gf:ҒY-'-^Z%_Z%סsOYziɗ\-ىviLufQ۴{0}>yMwpMɍ8x/qP0]Gn4\GN@UwݎI,yV'Hoe$s[5$X=G)ޗs)FVD/\lpowjRYISH^DSJ)GT p/ZhXYq8qEg 'jʿ";VngG%^?P}Xw˵Nth#m7PKePK+AuthenticAMD0600F01_K15_Bulldozer_CPUID.txt͊0{`=K@oKaa)v;c'(qfORV?KQ4x~96^y><4G_`CZi`Q0qHV) Qu&ۍ q eBLښu5PjP!l91$f[ O;8HG>oOM'4&hH1 a`O S`#KlO8*soH'FH0*w[F@pn0L_NerJ}SChڈy[xȐrʽ"4Tv ]N\xPn~cLeahAa * ]D;}@k kݿ.gZIu? pΟzkTôeJzY.Hh~]Ƣt]P{AНh-w<:\wm.B[vYs!u<\gUΐ:Cr΢Fau.\^YZƳ:C y3Ϊs!u<s٪2:\ǞUun1ٖuPK|]'PK+AuthenticAMD0600F12_K15_Zambezi6C_CPUID.txt_o:ߑGڗVKy@4-m5١ lg>!$ihÓ)v~:u \:Y-żn[tuF6b4PvR q[x9]^nB^W(Sm nUFw)(X1 &#?;!v@a'^ׅ&`DrE_㟉i.n>[`"i"fY,??9Cn],Y<̴/L>w`6_җ2jv`0u`pd a\`-yƩ!^f|0mBxc<&%/N>wt5U?ߓVQ!?[]S8JSun} Le)ݺcWSF ^uy\y??b܇i4yCG}- Q'=W2GJ9L G<ʭAl;꒏qa8 ċ]A@rRP=]wc1(8gBfE|b\ѓO>xKPya:<%x/#9jyQU(B'D ':o[@* a1 @$2O9ׅn8 gK ^C{r1 Zzus[mWyOkW7wxLOm F@c1;:@a1{ Sc'~z  ׇ9|A$Oa?TO>.rNO {Rz"H2Sn!)Bb˟F ۝\7g/4=WDuɴt, ?V߇7z5O,w@I,d>YgqJyD ?+WB0m ܘӯm&]#fSE6l<` n*=M6g +L8C&62H&)}aHx5YHF~|&v{E2YlP$'8n&d;d5a9;^ k/TPȫEq]Il[VB6Iyx 4Na9^\z~M8{XPg[ \%q 4^ptu?L9`RV*Ϝt4PK%*/MPK+AuthenticAMD0600F12_K15_Zambezi8C_CPUID.txto8WHf+a R_jhҝ]4/ؔis6u?;n{{U%6kcv&NY|[mvU̶֜mv#.3s2<Evz2w>t̥ϰ̙7~ˇoz3cg?/lo9D/N=t 3$Wٮ35c%oYmߜoDSw0/m'gLNO.viYgEy99L_a>H sSd9|yv/N#vd^v2i-[O|;詸2&ُ}.)CqVLVwSlYf'?忯ʗXqRLNOLы0x} ?@ P'a@;8M[FQClR] -at/0B(2b( _9L݃ jOW:C DrZ>餂U?RWx2nl!?Ѹ{=F@9&[ӧuz\|=1EVѮ:ZN&AHCHaqC&~#%؇ŜK>a'g$FH ANR%vN( i5B|?vƓkxG*UCCp ƍr]Gt֠5THy42We N^}"N_a9w0,vz 2L<,.}G}JRaC롆jR3X=$հ5Z]+1(W]#AMVςJREh L+1JwiS4JAyH!7|L`ѦXT}HuIS5ƯC~4BjsB/R Z = uJ~\vUB)|Ms<~G|qNns>~d6}fvpy" (;J% ]r^6]`a˒([qxt\mng]zHzA[u=:Ty9Cx[5BrCSs8_Ƀ\ȉ%t"(#nj{ȵ+jTPH}iM,jh+D@ߧ`ҋ}t/T3y"S.PKuyIbcI ]$EA K3&11196&c%LzI&6AN@~zIݭK'6OLIjL'6Ol8?q~bde; K2>?zIUG9SS'1Ob8?q~$I 4zI'1ObؘLI$IE~%v^~w#zIL3m@W/Z~;Txmj%驳I^\:s]$E~N@%iRI'5OZXY~7PK8v KPK(AuthenticAMD0600F12_Interlagos_CPUID.txto6 pnZ He,x-hb@ /Uq$}- L|3G ![ˇX~r>'bx1FϥNoOO~?RجѓIοl5/g>-,n_>)r~KV]̆n? 9OD!5M8^dT`AxG H"RIHi?ZKF(M$6dΤڠKK^_ __M*W6 Ce`Cjۯ6Δ HM;LX@ V'P(M@>aв9I:qӁo&i@@a A^GAX { g* H4h T4UIP2P\Wr4x bA~`t>*>ӧPYN Aǝ :b1 "ts 4h@4h@4h@4hT   y4YѣAڠ{ Š{4h+ԚZ-ҠѠѠѠQE4h@4h@4&ѠqA٠Nx1mZs[ B4 4 4 4  ݄<tdA~A;tߋAiV5=[ AAAAhЀhЀhMȣA mJJ8C[VCnv   *CCC7!=DVB:Q㶄~%ѡPkzn!B7@HDDDFѡѡѡG!+:Ƅ΄c:jMm5DfЀЀЀШ":4 :4 :tcd%[sСݶ&T~&СPkzn!B7@HDDDFѡѡѡG +:S:jMm5DfЀЀЀШ":4 :4 :tSd%ѡݶ'T~'LV5=] CCCCЀЀMȣCoC١nPZRPkzn!B7@HDDDFQQQ?^Kbw==*B{+VTh+ԚbM.RQQQQETh@Th@T&QTc+- +rSV5=\ BBBBЀЀMȣBCoP(=9tHB-!UDDDnBCN>B{V PPkzn!B7@HDDDFQQQGv֍zzT+- +rGQPkzn!B7@HDDDFQQQG6&BWPX)tEc*jMm1D&ЀЀЀШ"*4 *4 *t՞*':GQV =*jMm1D&ЀЀЀШ"*4 *4 *tUV xQ mZs[ B*4 *4 *4 *4 ݄<*tdBB(t mZs[ B*4 *4 *4 *4 ݄<*tYQv'T~'ҡPkzn!B7@HDDDFѡѡѡG"+Ya!(q{B?V5=] CCCCЀЀMȣCmBg1 "t th@th@th@thT yt1ͻsӣCޡmPP8C[VCnv   *CCC7!=AVt:tmBg) "t th@th@th@thT yt)[ӣCޡmQQҡPkzn!B7@HDDDFѡѡѡGfEzx_.ϹO܎I~,~TZnUZXoQª++l5X[aK8~M 6V+jpd=J8 Y½ܳ=qJ8 5oA,`Ua:7) Sf0eapm) ֩k3LYgpm) - ?PϪ6  >0ڵFV}umnm]aa Ͱ0k3,[zֵfng]aFYzֵf3@= 3vum ;PϺ6Ìu6Ìu6Ìuj{]/&[=7,W_oBkOS"[ R{푸7z I~R[UN2ܰvM&2.TX6oNo4$vjWWyxcԛD{(&Iɴ<{'^.%֖&'盘6TrcGGqC#᣸XGqSqh[y#$/nzSRmoa7[\"#cqO&uޢdFj]g:J#nDgmg%0Tjq#ffz~ՙ.21ɮh;hYpYδ]un̰lzp*u5Q4?5y2~x?kb++_h]V6KW>f?ĿV&t0gnIKB/J==l%>Zd"yOPv?+U\.O9?\WPKbF<yPK)AuthenticAMD0600F20_K15_Vishera_CPUID.txt_o#;4 {c>?V FP 5NojƃN5JxxѦuf nWNONOF>y?~6܇nŧ'd1/.֡mlg)tu7_p[ѯ]|L`,i7- _O30ij{vT^..ťsrsqsp.^q.޼7B-tXaB-\ }|vTus_@{.;/:7E+ɹx#\B V8,\Būwq{kt.&.΍mgs;N^E9LK0k1Y fpW0/9,JkX>µ?ݓòZ#r/~-i _kr?[eIz;|c>P S9{u;6ͩ<=gI..8KV`'|Sofh0@U KPѨ2+!ˈ J XzFօφ-JV-U*YiِXyU:2ITHVRHCD U_*icFۈ70mA׺!qnod0fFdm*m=6|jE2/oNH_$cdj"x=SQ$E2;& dNc4v۞4^MXcD23G퀯G۲LTu_]?>Chy+!z-ۏR_7o@IBeߙԫm~Zvw@WC}%靾g/&I&}Jx@T>ll >jS<;= jަjPLSؖ~^vO_w"O?PKQxBgPK,AuthenticAMD0610F01_K15_Piledriver_CPUID.txtֿ:Jtabif-_A["4ApBt}7hN?7,ge5띸VЈ(hΉ6U8) x×3`! !ֽ/REJT(YY w+zHuET"u.R^/> ;^Wx92)Iu < CPy3)o6420 ,AS}c;ִD0KcmX4vtB^R%}#":cё8cvֻi8NU7!\ @ntd2B}tmmx{.C77Oaw%Ň{pF( CNjj,\ُϷpxIY 8z2DZ76R݃Kj<߈IԂL5PDFOp.NC Wx.M],F]P6Fr @" /]9/6铫t@(@v!>)8)c.p2 fl5G)^$Vp€וT p$ȑ;\ b(0kvr>6C2,Pud̑#}FG @0d!ffhH.]j29Mc !9F~ %^bQg`jDj-@Gd۾*dƹ+*u-@{f?XCLz:M-Hju@z݉V^w t@tz1X(0DrJ/zgzr9CR$#l)eJ>;`AVTa(l,=ރ}vJT =;@a:qnH J#2$@G?6$J%Had&Y9:{7kh)r4{$^`</;,-|o{ J—fG[[[?[V}ߵLʞ{k?хV`(`Vy ̏;AO?.٥`XfyG erR5joիƏ4yX%VL|RCL(wg*qJegG#4Ukn4BP"DCFv#D 3fS3R9H\FGN3!#kEo OCCz ȠFb/rH{CU BFHQ9tb\1.bN$a ^L$!"0n0D|32-nB,WL3^Y[`li3lJ|[ldC y0bVF)ZlfWlnPLОXS˴l:Y 鐄w*2Ƭitd~dO3'-dMV7xN1̘ȰAMaEl 324݊LDjb5Bj^\tO_PTCoR"9OPMᄌ!,1 M7u&q?-NsltY[oi /&cM-x6-0T:,Ag-ٯw obܵ [e9n-R[Tl lj=ۺWtVY} ɐN ;MZXc,"8IJE;{Ԗgƥ6X)?֯s2LMI2&|GY8d=) ] Q$Tn<;jOU9P:eQAyڭRik#mCm^vDWy 9#A zDWy dzugH'i듘6k#I$m}>I[O'edp|(ϑ>HrP#3}#G uL[L[L[L[L[L[L[L[L*ϑdd'󵑁6R[L[\3 @دԧߑ?T 3 *ϑ5}fL*gxx9*1)s?ttS*ϑJ1]9R>A9RO PK4P PPK(AuthenticAMD0630F01_K15_Kaveri_CPUID.txt]oJ#;<$Z6jz4[!1[bܓ ǾhoTz^gO3$[ oNONO1:p<)0 f $OOb: ./PA &yBIU/pxX6QxNu|/("l? @ "D™@xx^ x4^5>ߓ,-8XfOUr-!?ˀ>Y.ns_Y/u'Q==/p<='YƧOtR~2}JsFHX1>.8A͕v|L񼘭`sy8~ZSY.^ϋPܪi[2%B@Pɉt,!G҄Iu4f "  96g8$Բ0 ;FЁ1YA wA.z 9{g3&;򏁂^M9!Z2FKKt@Kp!aa VC2aGN%mne(0n`wt,i1T&2r.pK 0Hj1a1$KGږ. -ֆ Е1]CaHmR8IHUI@T&Fdm?_fNwւؖ:,;4ɎW5DWbxLKc1PxDvph调CC<z mɧaBjIM>T C|9CZ4IQmK>mJw_ujZҐT].Hpο dm ځ̥z͉ϻ.L jqOg[XO*p _V4{2)ȟ?rbI/Fw4L94 ]Twb._L//n}L* / XC:P56K}#{__Ŭ:/ޖIEŻk调CC}z_܆~/ffjŅ/wbfl[koˤP5t XC/nC}v_ O~ j_?4.aڀVx1J5`O%0 ՌDWp<<^M?_Ne]}٪Ut*Zy& |Q_a|yr%VqH8!AG-M A^(fj!IVq8 )(-jJ%ly@S>Q%xYZ`h0ў+(>Ej0<:h 1lPK57PK*AuthenticAMD0630F81_K15_Godavari_CPUID.txtOoFx/oP2E0$V!Xr+.),@CW@8gvW;Ut;mt ^CT~zMcx?]]|z<eL[#Ĥ$-HWf]rv4ih%-" cFƎqw ^'F{ЁHUB]~!6흞h !PVC ՖנqB]0U\;ނŤ<#_I^YIT'qhVx DL  #4RH.3H,3w ':׊q03)8 Č23C1{|ks>~Ց18J+#ZsR.rFh(Vmj 2E ]CKst"$2(ܠDtKrђ>)&:/[sDd]CǕv=6D֡t\{(M@pDC:hC 5z zi?t\PCs$mI'áf=YD) miR^T.rO4b;۰$Ιkc9nR0ר7+vЋӓ Ȧ)ӻO4H;$|9;-ه\f%}\=tia|vߠ HOOz-<dgXx ,-X`Ⴥ?l=,mM(X CX ¿hA σo ~ >X`,[ C~ P?s}‹,^ ߌ ~,|Y C6&,| `,|'}_6ͻyrugn |K0½?)aހy/%,w6j;ggl9K:!%t$:\Ia'gt5PC%8yTHǗwpn6c]O~&\g)DkEQxxQrl|d,:*4x"i/Vk_$gM=s֧i^T=j50NGŅWnH8,+E0 x㠸iџS24!xoU㨊0~ܥeot(p}w`Fs"[6(&@T cg]FF-] OjoJ 8ytͻqo7h&w#\wig Lƨ"\oc%MJv'bU,&K9-:^8SЇrqcWeh_~UҮpD 8Q+HI5gcGn @HQ9!8@nӅOd*.  RuKbvG`); NS2WCC$lz崅Z,aLP&ٓ-kt{oKtLL*eh8㘰8LaER E$rO%!̺[kqntHJ,dDpqJ\颊T >JIW+26 fFpY{+!1դ,p$ H"7|P'"8]I[DY@6m(طXyik a(\Pt 4:O(Shzމf!q $O)О|: =Cly?*8>jF i$E-ʚNc M7&نe;Eи 'a90´{vZhjpu䤟]Qc$O L淩o~ ^7f/|5oܫ A{AǂOApT( OGe-V-=Po+-ϵ--<;³_aYoᷱ-Qd5z -z oc&[ -z s-< ;kOoQ { -|o$[Lo-[x {7WPo-[kkea7^2,>o ~Yf{(aހ^GjDӷ6i3,r=/ެdyả`{zT~H3ud'yAUevH<!AϬmn2ނ2r[!LE$F.̦H'# 0Dr"a ;!>n$#dxL$%A gB1T$bnȎJyi!! W(mmI]s5W+9*LK$OOb__WPIMlMr-UM>97%rLp>B0;q7 ߝU?Hgl9cR@F8L+x9dy1>Βⱖ5\rzrXe4 'Y>n /`8rq74on7I|4K n pqϕx5fi:fO"Mݡ_!t7sRDܺ~n OIާ` Gq:˗7@CANO]u^}pN>7,[*0~3ЅC$%9~I~r d=2Go)L5wq6yͽӗWF[Nw&Oi?:pg^˩z!-99̐e D͕hu D +80 ;$ZONĎ!+HA$dG\{oxg!ǐcH~M R<4x9iM&0cA&ȤRLwά5YGWRѬ$ZKCw0РϚT 3'CL1[G@Qڝ:0(RYQԒCw@ AyhgSEb 20DENBѐLw:$NqDEn-Ie(/0˷;lu[o{mIr;$266W%?C SUOVNj֓BdI>%AZ N咺4HKp?IGI5sm3~5:{zj _e>KR8o`4,Y9@OOU,_1# 4붆>QMH` \Zl4w[;",[ÐRQ*&BŁU@!@!r?MiMDl !-.U*T TJlV^B݄HEET$;d!pq!D|w1n"{QQ0w⥚H0(\ SIr5LQ#m5Yel SSՈ4i[U^!= bb-Fh)&LDj1Kb2"Fj1b5k1Q>-ц#CE 1Pdm1ced "bbhzcؠ?z. "Sr3U[L,lnF;ѻ]B}ДD,׳hEo"U/oA&N2A|e Fi&FIUi_7f!lCsdO pkhs&\EaP=kPH]m6g.AP/!QRv_h~5jj;1lYV#o PK'X]6PK)AuthenticAMD0660F51_K15_Carrizo_CPUID.txtOk>?.'K4+ z ;ڽXvj%ncA/E- yD_lojwσzlo;Pp _9Z]8+ji JF~?Q kx]똠h]k#Ơ)!L%:I\l<6/.ϥ|M T@M NsZ=tK0SIaZ Z p #')x${ɷ4IR 4xC4L-;vj_]jVvBܜKE [C i c^'NuTb (as-;5վu7JI S*G( T7WrUtY3 $\an"(d!)ZUQ\ aݜ:ӺM'@)@뎳;$)IL^֝ڔʃtzK1O|y1OˡyrLcD)Njbã7<̆w /EIʆ7 /ʆ om gZ7<ʆw /EIʆ7 /ʆ omã.;1ӣ,9L(SlvU{Pݼr}0R{a7A#Xi3Jj<J{!}+d c YIHTH`̤%TUY"&=JAK\JK҂ $ ֚7p ۫w#> DX J9z? {]ހQF=D(2bQ2)F Ebfx6ШlupsE"@M*T%»6:l(ԃB4Gb>%i@ @h tډ@<S 3QOӎJR葜'u|CDCmwK]iPK?ٻOQ$$ɍOɣ*O}й<}Od;d{o۝d-!Ucx9+w2´NxOWuus ׫OߞV?)J,\wE %zsytu}zLx9,nOo)ˋ8NSy,Q`fo#q= pXmIi{6^xv T7y*ú<ˎP 'qLH]4*,(p(<įDÒd% DIBK`vu/*9=rчսy.d[bhb@'Q%O(TJBE3ERÇ0An?7޸@"!TJvn2µܨf:7]FJ&n̸6Hvf\Da4Jݘٙ 2s-TR5f8Kt%xؙ9g+=e?"EBOvc=&͸o6ߘSQx^2S=3ۋlkRl$[ΐp`ĸ'ٵWl8RfBXPK2-wPK(AuthenticAMD0700F01_K16_Kabini_CPUID.txt]o8 ?$@9(腬iи, X[r'_PdIXX#Tʌ3  >h&*^ O8[L@ rnnr|u~:_&Nw/yRN4zzPޠj7ZN)Nmlxc}l_u}:cuyo8\| lUK@uT[T0 nιǩЈ .|ìt=L;AD&"|d 0AbeHN_4 /B NA=S2lsOVim oLg n4݀o(dz?)pvgz?3fSq?|2>v>RɝOnu>YA]V8dɧ'7>òS瓏d&~OfOv>9;u>|r[@OVeCAu>YAm Ofyq:|'koZ瓫ONO.u:PtYPeCAOVP||rj;2%';#/–_>r LGaVQiV _h >E.W⮷/pqv=RVC|B=F,k!t<ͼ$ZHqClw;]Jk!25 LJE??\6/wdUC=k*HhCx 2O8&a& aFt9̀ g$ 8Ub.w`Fez.Ff]D)\lȹJ ibX](,\ ^ȸiu13l]krsFLX#JF!W+] r{[> p? PXVC(S9A>7(HQ/(JW%p%|xG02vw@QcW\]K ȥށe LWW PKm^7PK)AuthenticAMD0700F01_K16_Kabini2_CPUID.txt_o ;ܢ/6Ν$Ĉn!xFfb6Jt/CQ$%ZAPZGw.59^ؤxSdndN`e+ŀ8(͓ӓQ߅WW!"yRBKmpc?RCcr)nZ^Bс'@JύȒMM]9[fd_Vj-#S\JL![~$Fӓ&_?s= 4/N=B?%.`<Өxb3K$X¿GӢed%t=1Ky6B_>5׶',mZ{V|OCiL˰k >.|c7'i?}x-_\:o<Ad4_eY>VRpk6Ot֗ZX0Iߒiq2w4:O"-e| G!Q#)!B9BEJ¬ݴ4p7R*K)Q2FGw1%-@r mIu@y]G/ϵyO @ VcJvn)̦W@i{9`| m)0`G F RP1aqf(!6[@ш@H\p(TݱݜkN0*Zu(P2Fa־uLo%}@9Pʊ`wBSW#q8f0J]8`!r`DR\ B5[3^ *)k1WBn l/MٵB(b  66zݦTB6s;Y't`';n'+!?OP8~9d'6!b/sےz=XiE0v N(wvv0;+D !K'F0RPFzx]] ]^_/FG+F .o9w Yͳ$Ͼ#1z!fpfGi,`<T`/ +9^}0y`^B}0/!?'Λh̟E``^y>}0/>`9#(_y}0/^`>%Sr0fVP̋`/Pi!O.7u( X |b j0;5;~x>_M%Xj},·_q4^OSE=,t nd*%qQB=Vw%nDG4B%(aNmpBC3%A;hl%x:^-f#%4p0u.+#hj(vK"3?JfzЧ9§xMy0w䚘܉R,f[1æ02b*3T;1܉Ѧk9;1ψ9`b@K1 dS7ܭ +paSQM1D|*̐$-?8NCL6J̓ŎH@P kبzQs8^Q2K$QBt,O7R?PcDqק'tEoy?xy.s4[Pgz#wHOO&c5t7eԥݹV*#]d@wW)ed9 M~%q2_oܪ9%G "`nY#ş?A P0N6 \ b m^_NxzrO7 ;ʟKx{,/n䋝 oXÉZՙVC9F R9d@bȜb"eu@!G* ,Adz4HD@hPZ,P+ZWPւAiOXڷh9s{[3P rE)Nj&ܾɲS_k(-aAՀ,-o(Ă}55.ѓM E~£}S#K?>5}ۖ\_# K8y| jл;lnA =z[/<1b"b,AA vry; ^_]%7'`SءtaͥmDvb,}䇞gu{%~>nT'Hu7 zg\ePcA.k[Mg}=[5C`h_eD}`  Mc w7KiQ5%Ъ =SK9rjȏ +0M%3 SN#\O/FV Ǹ QS <,Q4[ jF6*06MP ^V¹omŊ4]ؾI=z>[8*jiǖB_m*lV1o/#[hjdkEft=hO[.1ȠTv (_*$hZ%9?YH\D,K"Mh]hZGJд SU%е66 ]im,A%zC}=~@pn ɧy;I2`bBxٝ`:.wK-Qr8Wp [ve-u+u^qK-Ir8Wp [ve-uK`niwK<----'C$n qyݲ PKP9k)PK-AuthenticAMD0730F01_K16_SteppeEagle_CPUID.txt_o ;}I33;]7-`d5ځ4I?}ADJ,E*B6Y/wGV+Oa1aP?=9=)&ᗯ\ŧ qZ n泥0d|Ww `}Q;jCd@?;vB[i?tIVC}V5eO5Bi.KU*ua V+ۏ?: @bňSK(b2#ʤ<^oàbx? j7 ? b>c=B^n>=I`N`=?`~ `~ `^C`^C}`r71/y8Yz$/C:;:ϓr /7?W0󺼹ѧl>nL.<?ó?N/& [|gM\>"߭]~_&43^ގf^G,\{Gei r$%A[64KRےx*C^tn%('*E-HHimf%.xf.8ȉ7Vn^ۭc5f6ʉ@N2cK36-3j'Drp]͸mּ@666&K lI((.%lq;~?P$)Huߺw_PK[PK&AuthenticAMD0800F11_K17_Zen2_CPUID.txt_oH ;p/ `*O@"b3"O08#<#[YIu/HJCqJG_jgN"Go5[f|3]/}.ȓ 'rdl=M⫫"'zOTa׿E0꽛?2(>t·e8/?Ξ#qB"NHxdtU2y~|>3t}|,#?5DciOُb];v~vZ/k5 lwޅzq=OeC~Ȟֳi4cf5R0?=4[˂5gUbY9Dq9Cfޟ}0_OJq8}|^CuoM#[s`W:=}`lf~6Mz s*ϧ?pNL3@W5q;>|M系|^ƀ/Z])e,'/7\ol3"mŁ8p A4 ^$l dR6P샼HrlW1"ƒ l>ShE6K7!r{ 6Na^A~?o{19 wȅH'C>p4r<׏GsF@ n^^(]nؗ^*!)/ᶹ\6> #G@7pk*L!I$;ea Il@^ID+=Oe6oR6v W"LWYNΡnC3kGЄ`5)6GV9@#(@vQʡn6ky6v=]r(CܵN6$CE=u5dSO,'8s 1X9vs'M텥h_ء, o-@%ڱ'fkyJϮ*:a:}ꏂo Wj1_xku'ZPB{ ͕,|ewe-iƃ `!z5rk9>X> C >tH !HNX#҇SJ1:pK֠7$k kh\R&Dְ"k( "k8ak&U Y[Zj Gx Ht,HH:CDC')!}85}㡃$kбd z#k@"k 5YC557Lx@55]\K7$} }(!҇C> kBINMV #kбd z#k@"k 5YC55x&:7 -j Gx>X> C >tH !HNX  }81}ZIHJ3DP@9Dp>>v$CDڠcIFڀ %D"m( ҆"m8amL(++Eݣ>v?X? C ?t !NwI{x0$mб z#m@҆"m 6iC66 M(+WMݗI{G}?X? C ?t !NbJprۤc^s DCC|C]^b6N) !ܪ)b (JQL⡡drW%Bxx0 +Ɗ"V'vճ4282A-9 #!ZHm#9F-#GBj3[p(ؕ1g 6qV yxY=g?Md9{ qowBT7* | SETwꍺvA- z&f1Mߑvƚdof ;zF?BNn& [ozmۑfvYd(Uj_ӗpo7Kbҗ"{sJ&.freb/R%piU3}WƼሪA ]eQv5Vлk_d$&jVo`!1]kҳ&}k2&Ck2&Кk$k6$I!M6mM2dɬ kҺ>u}2dɬY'Of]̺>YlMĖɭ['On]ܺ>u}r>ʻmچOn]ܺ>u}rɭS `ۦmz}چT8WmچgT6ڴ 36ڴ YԧtPې>G|Mې>P.n!U}J̻mچOa]º>u} ]QeG!PKGT 2PK&AuthenticAMD0800F11_K17_Zen3_CPUID.txtmo8w8/Z rDIdj]onP,4hDZ2Χ_z$۵ٝ51"cjK]796z/;ggl}U }aKWIa(Yëc3Ybۦqγf}CUGp@ll@ ~Nײ_Up]7,߻@} O"Xg >}=Y F@ u_d)]%Et졎XIr'c>Frɳy.&.`6^|-?J_'B/ dz UO.Cīx?eI6)OVy:'a!{1~HDK4[ϓfUTMB]Ĉz.zv^7L*7*gyq(r?ud YnҧLBR92{}=KMz79P†+nu-vV^.z#By !X$ܧ$_G1z?FA_ :o:d>? [R.'ηqb:dmlmyJI o0\dZJ殓j\}`=|1i^9a¶(ZŢ7Mc!8@B$;#Z* EDM.R2jO=ʓ[˕붱K4Vyv!2 vHZB4ց" DtJ%tCd@BS'Y yCcCVO?TIý!=ROPb! Te,۶}BlQ&a:-7Up v00)`օwc9h甜]T < 'C+atZ_l4_ R*]%|A ^(MMŖI. dtDrk ki?} >Xce`C p2dCPB>`P}xi{|@kP5˸4#B5k JȸhJCe\ßة;|}P>4؇2d؇ 2}xc^}:5Xe\`\C p2d\CPB5`dɩ;P5>5|4 z=>tkP5˸42dȸ 2kx/B Gʸ?58k샺}@c}!cN} cJ؇lʍ؇`weBDZ 4`r cB,Ͳz*`ր1`x#7vAlcv82}O]ɓlgxq=C``V,UY5yZ2M!01g<Γp!jV-B$͐ #O36ÑH-FO$0VݗIq{E+ȋ@…k ǡxi!! !2̱6/pS(ՄV2ǓkqaL*v2JB [%ÁV=#ݞv/uOwW6)'gsOFٜ?7ucl} q \϶ ɃހW5aONۣ9%ؓE΂x~}Qw8?Wù=jd*{3ԼSflg>yegn8y՘׆Xjeos-Nz y5}jzڟ$$&* )߲^mڤ&m&=m&GdM?!@2_">>> &IIIIIII,dCrA*}F]rA3%>>>>>>>>ԧxO IITIT[T[LFw O֫\R!V)dC=v\Rx[ק\Rק\>{o5)9>~~2m}2m}2m}2m}2m}2OQѣ\zwPK㳵V 3PK'CentaurHauls0000541_WinChipC6_CPUID.txtRM0#F꥕6IHAB M+U=XIKLjj2C~>=y3=f6/Cխxc[U ѼAjږ8sxd% ^뵩MsNjѝZ|L)|9!L',-S-hU7cu0o\m#*l+=WZ7vBDg\%$@Q({7)S=x;}߭l<tM| Nm(0= ,}#{'LMWm PKQxuPK)CentaurHauls0000541_WinChipC6_2_CPUID.txtrtQ0+PXPPPBffjbk`f cXX8"YmiPKh~YPK'CentaurHauls0000542_WinChipC6_CPUID.txtRM0ziamoa/SCHܴPz$Qȩ,-E*vC);gy4.v(ދ':k$=;(`[n?"~pO,PcZYZa4b YrFj3呟L huGվ+{۳ sZ Jj̤[TsA| *2%J(DTwl_$s5irqxo0]κחыRXxY.$,J,I/γЀQ0>s,+ʯN?7` k _Q=P_{(Ch3x:fJPKQ+PK+CentaurHauls0000585_WinChipC6Plus_CPUID.txtT]@}e:3D؇]MY!YB҇N[l}?7˦{9s K$ ּ1 Ә|Ķh6/PCDӸY n2`%@0Qy'X>D>'YIv@n8?pEa^74E4*WCg?e iDYQ*.Yl{dh~WoBZTzJQQE7V3nѰɧίC]w6qo: :EZ ~"M]R6(lmyGs\b#UѾw:?(<JcCQw";t$DAq/{HN?Q,&5 I6A)h%v[e"oIE+|3NR7nԛlkX/zJ"G%U2l{HmNVa!;IIUPKH. |PK'CentaurHauls0000587_WinChip2A_CPUID.txtT]@}eVC,!I҇N[l}u7˦{9s +!˴K־1 Әb#N j</llgiDlDmjcH-3 w˗SGKxJpcӇ?pCm`%}Yƫu!w΢H~ <ӈuR,Dն{; cC%`z͓BB+^^gQr|'.yH9m"lǐ*{[8zIF8)6i³F#ɳ,x~ҍV !hXu.zu,{X3sj=}#䌘&GHo+p1J)Xcw< #׷(%G1 e}~F"7+p".k;9=wEޑ#]yG.r}~oD~9&-+!_]~lrаbknH!D|W-qX,n/$W7 PdeZ7PKO\ PK+CentaurHauls000058A_WinChipC6Plus_CPUID.txtT]@}epG#FSV,K҇N[l}?7˦9{ K$ ּ1 xTZmw>Ld'6$8 #00Mxq} C:$3Dݩs ?A~xI8QIl"L=pݦ(dАSQr=ySFR/7es/C]% a*j%RRJQ;QEGvb+-aѰSRPnL0k n~:EZ~"M]R6(lmOèR-D}􁇈cy9gEM^w;:16>r\|=1JIHɉ83տc#rAxEڤDئנ78ߡDR/]y+,VtY ^=M3uRR Afş]ߗRWdJf3܀mX؊=,v'7 B " PK!RXPK'CentaurHauls000058A_WinChip2B_CPUID.txtT]k@|?lKYݝ>,C,DcNP϶ZYrORחtbwfٙYM}eZ%|kߘiLe|{x9 xv4F"O6à ؀xtj!WE_@[+8ZStdt&\ﺥe)/'2j;ӌWBnyxe%Rm}&/7@fK'U-BWJ=VsnHs؎*ǿۘkO6Wu?ćb&Xe%䫫O5M6޵VWvs? >^'j'/p =Oǖa!;!IBi]PK{ב}PK(CentaurHauls0000660_C5A_Samuel_CPUID.txt;0{$ i8p#'(b4#z>uɳWc4~%q@@Qd,Rtw rP#W5O+$C#eoh$"I7<PKŧ PK(CentaurHauls0000662_C5A_Samuel_CPUID.txt10 Ew$ Xt$e`cWAIZPZ!,Ez^^xާˌH)"'z 3O TقsU[ueKa@0A,%d^)Et~'?m!eV*9loJF+PKNHtՒPK(CentaurHauls0000663_C5A_Samuel_CPUID.txtM0 rdK,t]7UJORaQ~Ka@ɰ@ȰRH_$/Cʬ,aMrp^/JN+PK-j PK)CentaurHauls0000673_C5B_Samuel2_CPUID.txt= @F{;X'v6*՘,<6 ^t\n1B^3O,4j+[(6hN :휟wtPvK20AT#[džvƩ3;ay9PK nPK&CentaurHauls0000678_C5C_Ezra_CPUID.txtk0 n쥅8>NF I I $96_?dձ z 8t}C kˬP%|7:s]lط5`,&V?3Q3xW-\'Qe2/eeeG0}?nfBV"DE`^ [^ȧY-#,;יzɸգgu_ѴfG_PGymsآBQ^H؄Q8nRO8>Hohqf7_&2a/ qa{Lo.93K#u/b\Bni VlAL\jJ'-R/p 7PX؋# 0_nA,2KPKg8"PK&CentaurHauls000067A_C5C_Ezra_CPUID.txtM 0Fw#ݕ)6-, ~sS_œ@3xigQ< Ěл{k~aF%SpjÖotҿ,YPDE₃Ǫ+PKVPK(CentaurHauls0000689_C5N_Ezra-T_CPUID.txtM 0u C.003]Ju΍cK@,ZpR-MB| s5LNQU3ԗCXUٺ]ѕ..e`TET)8.g]ҶؙҿT&QnG՛2PKߏPK+CentaurHauls0000691_C5XL_Nehemiah_CPUID.txtA 0u0$3/ixH%4 RHЖ`BN A=y\/%Bc$$[6ˑjg~*Z VZ_b=m;_Pfe)tZ*oiS7"?T!rk^PK&yPK+CentaurHauls0000693_C5XL_Nehemiah_CPUID.txtA0 DrdIc%v]7@ %`ip D`x=|=* e 7C"~$)z4-:U)֤BhIevGR&;LzLG^I+o^/$cIcDzO2}PK>?ΛEPK+CentaurHauls0000694_C5XL_Nehemiah_CPUID.txt1 K> `RnH6{@Vd$)x n#*TL3Kd*Td6֨S#%Û+h*Z  8m-}ܹRfeIQ. -e*~PKչMPK+CentaurHauls0000695_C5XL_Nehemiah_CPUID.txtA E!љd$RM%Ғ N&@(6f*K1Tzr d58rtLISb t#83֑O v;Eʬ,eN߳}q~OWPK3̑<PK*CentaurHauls0000698_C5P_Nehemiah_CPUID.txtQ0B-h}hev;8!xiNc/^>l҅e dH6\6E-iIV3 xg2hÌ4f\dy4kmm#UI$b[]el)8x7A-o{bZ_ tR? DD;+)<S b%MO:{W=VBb֦r9OEw%RUk^dw eStiPKs:PK(CentaurHauls00006A9_C5J_Esther_CPUID.txtT[kL|7?^ڛ$ȃ,[q JʒKח%]e;s,W輈op0S=pa-g5<1]Dvzwq]|l 5FSs`>f.fmp.ljT ׍K8U|SA?YQnu>Ӣ̫4ͯt_l9VY=Y),´z u.:-* (ONtx>"]Y^}$K)64Czv8O1w0zH4û)¤?}TŒmC| 4#$m=OmR[v.nFq,!ؚޕE _d:YUC= {BM^Č⌢b&N"S ،r`Qܗ.vqpW|/ʟPɢdc˗W\~&us3wu ,L!Ħh}=PlOٓ魷9Ċ,aUr!\N6/;אNv>k ,'pڎag{?Z\N H r0Ea@#S.ZȈ⑕G|˄(ku'k×07ۺZڌPcf[W>_^K핵.{X g&pk7/'1ՙ bTJ"2%'W&#EM!ğF$Z+$x<;Kِ)  ѨD${c]H'RH bsD }_h?I@,9/:? *b)*Hsa1ȑK{ߍQ*u ٮIk_ @@T]mtj#< Pu@43@M5]Fj54T}~t61UKEO=T ܸuwų::R#,COmAkն3q`- 2")%u) >Ekqr"-%ˆV$踱P*/rT3~o Mҍ TS]Yl#,NO`ܦ\~PK*j PK(CentaurHauls00006FA_CNC_Isaiah_CPUID.txtn0DJep#KI&QJ$Ai|껻0{EIgNGv̅Hс\\ ˮ\7KG}h}f:1(UTI!1ޤ+.>̹M4/9 ֶQז7TEm8S,Qjݭ]wuȒ2<Ѕ+7; [DHKpbsؖD863AJ": DǑpX |#RR, Xݯ@|@EP 40p? eBVQ(*IcUHno9ozo<P2,l"rXi#?H*\`A.%3mYDOCi٬ 8r6dD+UqDRH6B :TQ;9đ#`-W@o D @U5m}sЗ6AKYڭ15.W@\A _^fJ{)_q<6( rNEr*.NjqƩvN5NŎr*.N%jqƩ>S񣜊SƩjqƩjT"s( yQ=2.̱X0-b,j?r`Y pڢ#s8׷ax-f`s8d $3b'a^Y,ȣ$IKIB{t,A9/=I,{n!'_%(KG%59(K<ܗP$Z\(I5*^hg#:$/\坎U5BIN w8&eW:09}zPKb:4L PK(CentaurHauls00006FE_CNR_Isaiah_CPUID.txt]o6;x.=a{]nU]1Hؗj|3hI9(@}`5reFDi']Qp"Qܘ@S+zͤQ^W9hCe\؅W*o /4r]0%w+vY5곛>߬X5C!{ÄR z q55f1&za^C}dWnu~ihOz5(®=&r%r $ J|(ZYֲY͖>aIB&J'=d]Y=le2Xlz~EFSGCWTC*e")8pk$*giMM<V傗J1zH}7"u*^A{_"@`Ғ(CW&B!hCAuo9A{̴RiPZߥq)?|GE#*Q9#w A @isNYp J)D#F$gg(Fip O 0#=H Agꢜ,)RLī.q5,<fDԗkgWQ Aԩ4.e'PK@OV+PK&CyrixInstead0000540_MediaGXm_CPUID.txt0HHJKd ^66R$T`'&}RuN=?3N_a#uoݍmB{- B72^L(`"ka[/Rh>sCp'dlR_exڕ*n}>JEӳNm&>Oz$xޣmTU&Mc+Yw؉'HVuA"Tih{UJSL/ ׅ AT^|ZK: :VkN`[\ԻR0n"txxU?TK=͚,y+ -y6"϶gQB(OC沀x%Sy4&#ߦpz#=<bỐ z_Bc?a] 7>\ĸC4qB0$"Cc4z4$%Aj}Aȇm#rUTZHmVlG-6RgxVd'X(0?TUT'PKL PK!CyrixInstead0000600_MII_CPUID.txt\RMk@/%Hi% rhl ,0cEj啻RTj4̾am]ToÄJֶ:Z} ~Ynw\є'*>9OHkANZ)H_}HZjp/0ݥ- J8P)LjPq\r\>PKG~PK'Geode by NSC0000551_Geode_GX2_CPUID.txtKj0Ds_ԟjɻ`[]6U&x6_u/G*Bggx[o FU0?P١"ǜߡz@4/+&!ܼ)I*~E:F+KcdKe@>O,6Ζ.a .ٸ>!/p.c"WPKp MPK'Geode by NSC0000552_Geode_GX2_CPUID.txt=N0{$ 4ޟY;Jb_ȣ%K|N|"tvlTTv(B;T[=1-X3<p MMR d(Y=50ZY&\*yb 7vt SpaNq;RGQ?W8/2}PKPK!GenuineIntel0000480_486_CPUID.txtrtQ0+P\U $f˅@fØ PK N؈~ |@ƽ_U@&w+Ǩ~*l{ܥ @`rvPKZ55;kePK"GenuineIntel000052C_P54C_CPUID.txt\R0G?$쐸H{i Z)j  ٝ5ͼ7O '4luNAmڋ̈́Aܗ#<1#1eVhyPz9$q'"&~ӤRPs;Wsp*mQAJ׼ɟ\gi1B]'? A$ *[wЎ5vg.3h Ϩ8ؘ({|C0%5 j5 T뛫 Aon¶HՐ2ς+%:É+_8z"ӋF,K+XHYK{WC4zfnow/h^0;1ˡp.?һ3?Gl:4ܧ @@KׇPKvzroPK"GenuineIntel0000532_P24T_CPUID.txttn@HH$R rpH aExXXvb)6u9oP(:~]ӵT4ԃ}N&QR]{F^f 6]W&7He$\b)rPD#lt 8 +F@j/8VTQ_xC $-]Kx'E_ 8ZI"Rh!{g4S˄b}Ե+PC0=4%+hl@&Ҫ*>oD FI~H_{kz)!)ŞX^˅7VwKcҹK,eNyw0$T. ]6KIZb_xZ9~gMϐcݢCXڟPK„"PK"GenuineIntel0000543_P55C_CPUID.txtR06cY65`4J$jmٕ%ۯ/[(9y==3P=|;:jO71t{x}F VF]g:oi6F>&Ae[}G N <.]'V%+bwV{ fȹ4G^iPA Q!q:Y q!$axvl:YNڶ'QzH gL ^͠e+N /,e4<0,{f{W ޴g~X\?سIOר~֮SeO  9g~+R}1hjPK{2PK GenuineIntel0000619_P6_CPUID.txtܓOLߡL` ]!3,{hJ"clf/ꘘa lSV=V`)kbi.&9's D-L#DYzD}Ŝ2gNAGRjOg[.Jd(uٞ S#0B`<,|9AUf*#.q\\hBjlj :4^U/(RbՈlĤ NiJH^嫬ʙidZ(꠼.^Q;e!CQUŹa'4"cƬKGYdAIĉM&oܴɷChTwk| UAVD!"nxEbf]]! \)Ѣ,PKe޵jPK"GenuineIntel0000632_P2OD_CPUID.txtrtQ0+H\U $f˅Hf C!6m&& PK]PK(GenuineIntel0000633_P2_Klamath_CPUID.txtrtQ0+H\U $f˅Xf2 C!6m&& PK}{7R[PK*GenuineIntel0000651_P2_Covington_CPUID.txt|SAL*.3`md-&Fd,]lܦqYlO^= ~EUf,ؖm-UqP x.lɀrw ¶&(t>o6pGހNh)&<#t/Dj!U!__~+pay&>+*.x6{ !q %%E]bR;Fz=ؙűKH}H&C  .ao|X!S)QL?(I\a3*ana̪Ҷ~PKaNfPK*GenuineIntel0000651_P2_Descuthes_CPUID.txtTjL"3ZX [ b0c !<+w%NHjŴ}0sΙvj6ˬP%v0.ZoeZÛ8b.Ô*iSR!zzqaW ϐ]1'ϐrXIms wq'y&!72=]~U锩vL#QejZQeξ疘D0ɴ5iRum,-k)`cL`B]{C<=McjW_A=,ypE`#l{Yku b{7vYn:pcK&6!8V3poϦ 6rd[R}aq&o4_-aIH8&q }D3_Xb2xiD#k-l-#!|2u_Uwa, %>n?c*o5DɘQaMi\N3 Y]PK(cpPK*GenuineIntel0000653_P2_Deschutes_CPUID.txtrtQ0+H\U $f˅Xf C!6m&&& mPKr\PK*GenuineIntel0000660_P2_Mendocino_CPUID.txt|SMo@#F%1RHXVxl] u뫅Pfhy]]%Q%QUY ةA6^ 8SLgbc0u[7=KGԟ- r|ۼ @k* Dɵ,DHw1"g՘ߕYˮ|O?DUIxU&5]wZ^2fϲ$ /ěS;XYK&)\GUIB w̆7?, VKq4(yƊ6O8EvnX>CT`[V价ȓY7."}ejƮc{gfO\7"[o' -4@_mmcl9,Z}i'\&Qty Vtȫ;}x3Fa7G>OT:.$7,K8MC ⬗ !ZB… . Zs BJ,^\/XyӈϚA'>LĢj˾5PKSyPK'GenuineIntel0000673_P3_Tanner_CPUID.txtܕͪ0k#B%ݔ.놀N_l'Aa|6= = ؏Yn?׊}kQmT&M0H$5[Ȑb,eSHVL(!x B SH=nrTT֊Ƨz  2fT!"n A3!R)y^7`B}iAG჎$"n;1AhnևPYIK_pKa\ *X.Ej@8 @*-LeLFͮ~ͩv?=PKʲ.^ PK+GenuineIntel0000683_P3_Coppermine_CPUID.txtܔOkLߡ$jrp]!8 !t&j붚_Zct> Ez lq̘iT}T v,;B\EX lno',{l_wwz >A*;QNȮ+HӔ]O)l w @T] uUR@։)hl;,xs +n^A:]/zx-F iOn~cKؕ{UuwYKSocr0?\Z2oyY<{n1"j<-/\\{:w̃Y){ B:I>! E `؟G{ #'k72̉Am#(A:CYǢ:[f}1 ?8ϗn_]hZxDh.qh TA>EB2?z!7biUQ5BqzE}kPKUPK+GenuineIntel0000686_P3_Coppermine_CPUID.txt\k@{iʬ?V#1z'4Pb>,vxgVoՒ_td~ZzgRmY^njiƓJ= yN6Iwh3NƒdqX=>Nlَب;MS⧟]=sۏ"dGTn>cCUv^MCXJS%]g(?ԁ5M)g42v/:-=n9_wP`-dE+Rw})i0!z/64X*! []d ;\pkg!Wы۹,D5 綋*>gQoƃ!b4E<X<~\_E5-tC7]"'tAvŞ= =6״7}vޫDk xf+_G4IB8G9͑p%L!%.gFJ߭$. Ml tlH P?[PK<JPK'GenuineIntel0000695_PM_Banias_CPUID.txtk8*7d6?(I,ݿ'N6*`w&gxM[U _Ɲbxi]xxo|%pe @;\ߣr&T%|ꭞW1{ AV]Ҫ%M]AX O?b/ γ*TKlK_OMڝsYEZ]iFw# z&c4LUʻ x𤫾`jBL?^ gwɳ 384u۶n٧zhF5%\}H}U}4:âwWM_.N}( |C>׻"W`7Ve~=xUe84_)D"6D–\ĄW" cQ2%$$+iD̞"gI)7DSp%Nn'KkSphgE"D#M$HGD2a &BQRHv%hS!c̴F|f k+N7W98zƴHBQG.|64G_.`lґc$蚦θC̤s%93IJyDi0G\KƇ0\D Ľr F $\'BjݘXUNo;<kszЍ27<[-v/PK}kPK(GenuineIntel0000695_PM_Shelton_CPUID.txttAj! butJT͇[ʋ,h Z5hI:?_XZM D* uɃ`!NҒR ZG6F6#<Ӡ<"X1$%QPK]փPK)GenuineIntel00006B1_P3_Tualatin_CPUID.txtmkHMWfy$^㕃KŤ~c~ۀ ; =c/ؖm-RO*N.&'T2fV5e=>ll"&q'h"Y0[4\OIYfIt I O'r>BL\!֍*Tczpe;]tkHk}8Sj[Iy&MR]w'ǰX14[uBFeuS UM^궘1i~S;}NVVc&Ibˋg`v"]4Gm%SU|$v7֥\;3q3UTETGD1-F\G.t\!c"|iVGW7 |6߈Xȑ!E:`/F="zK|': -||1OADF#}W܈x ;0CqPp"}I*H"t}cp%gܴƝ OD??p Vzk]}Yq >#x6{"~5Cq}Ӕ+¦C$x7!]uP 7ߔSeefgr]ZS'XAW,gPǼ9?PKFsPK'GenuineIntel00006D8_PM_Dothan_CPUID.txt[k8*],ن>ķNYB- < #At{7~NX{]et!ӏ^߲8##m>[-!+TL~ at ]X>c$虪-j,a> a4b_$eß ,\X0D<$Ai}e,?"l!ᯑ+H:*1B)u4][/-:?.uk!y|oPK:1PK&GenuineIntel00006E4_PM_Yonah_CPUID.txtW[OF~pDg㋄T_w @V qX__8NlC_[|߹z=\RU,ƣӪU>$Y2?{18<UG*I&bB3A^.V㝂ì/ěliQ%1ޔpN6"w8s y,fteڭWUp0]^!Gb]WE0Wu#8<121̲bs-M**6yL0-D[=[-vpvJ3ұ 4A{>SMF}D܎G*+`Ӏx ppQ|-oxEDa'MȖƣ_[l\m|̖նӸq V cDa2#d„'7 }D  ]D-`iaHRh53) F x@vuOIBI!t _$ѫI k@JIvh# h|0&KD=$6d} { )r:Lr~+?ND>4@x<ȕ;FB&cǖ#$Klm{+ВB}2Ba <'W8oIY(;/רNC2i<:ếYA-noE[xo#uȳ:WG X+8 W`6:E_jO'_wށ<׵z&DM&mE(+)O{1؟{IbOz:i{] qZH ⮖fՃ$>P"R<ђ8;-Vr>BЉʁK74y&`yڅxڐ4RcH=i^ ^Dу=xt^wUЍu|/.IN4N&BSQh~zvֱ>DNH9Y+ewh`0/K6KTe p!?~#l_[2OW}Ezv|ַe_WStX1/@ѬX:m SϮ>X,⦡iMz] |`u^&3>\qlc_ٜw!>|i/SެHEؽfUZl+=U(Ѷ}hWwy.~e:]7Mېff9JZIH+GIO>o ⻌}EqX^&@D> "DIuQ0P t" ܈8q%-+ ['t"K%߈"BG8gԭN+jR?xt6M47~s ?}K_ X,OɜKm,/L+o&\mnnzr7r|wpaUm?i;f˛Jeq"dNAö-12lv}D:#t:@iKp{p(b mxD!(t1CDCbwBQ<ƎdQN4F[8h"!וye~,dBns 4-Ef6E ),qC T)pD{Yx_PKTP f PK$GenuineIntel00006F2_Conroe_CPUID.txt씽j0 )G3n#H6'(ɢlLrs,gόOy:?\ί;?04 ^v`2T d"Pn{mDhG K]+W/]~$@J,\W>E@'\A9 &+XxTC4ͱd t/Nl{tH"賔(NiV[IYQ25R㉢v6fa Eɔe&j,LJ("*Ha0Y-AXV4pp(Oބ"WywFA XmU VvڭjݪPKPT PK$GenuineIntel00006F4_Conroe_CPUID.txtO6+8^@cq~HHOn2ФڤKS.ܿ~rI l$L+b7xtYEi&ZD+x4S*L|\`S>e5EY YvwPﮞ >Yy!ar  qL_~ Ex&S[ɮ*ȳ"zrwyi'ezrY6IǣY+T/e'l1Q|M`UedT~g!\$.YB¹i&Dk5?YV? qG#ZǴ-B?G3"na*pr߳Fbt]N{7U" ;׫ޅd[: u86G,SD0-."9=dC ?$~sM} ´b-Ra Õ6{d D*LF @k5*bq FWǯ&'dh$BІedf(>R=乀RyCd׿e{}#ݕݒԄΖ֕'6"'1g!~~ :hy]3[.b0AZa׋)UĊ͐E.uIl=>BD=$Z!F/J{YHeNqB*R={!qC;FY_B^^F6  zեG"бSejIq!l g`}̮$Op%7[Y$ g@!]ߍGPKe˹PK'GenuineIntel00006F4_Woodcrest_CPUID.txtMoHJz.mU4H#=-c$;hIص!q&O6nre!RBUR]R$Kƣ'b.4oC"b0bLI'.X3$ Ӡ'.a9g!/[cτvOd{|NTVZa_Ǩ>#īhAK{ "?^j;oȏfmJ"XhX$6`>94NA.Б#X<8|p`Lxp>80Hxp|<3}l w>Zj:i\Lu\ {L !tʦ6k#>B60IA{3($,UĎdѰapa9D:! H;h ۹(jDPl#v/0ʜ6(c.&]h Ӣ):T8{.l`L6vuvr~ZJF|noj1Gz8M (f.'Y#;iC5:mY~uo>d^|ӋY:$DkBTB5UR )7DAD $Aq=eEJ:E!l:!艄(\S&޳"bDqH69&'c:6,#Hzf//yijfSyFde~]D 10O2fԔhbJ=-s<+)j'>pYιaw'|/R j}}өExV4Q¤L`_;``ȏ&mJ2#P|/-;a:9OYzڋ0(ӷց:[wU-mѹC:[ZU!D bf= ȯ>Xq!A툰Iߊ6b^62 ^㼃DU`  >xтH =us@TH"#Cm:HԎ`׋ZD Qms&\TK=a}dAd$"!3M;^5#ЋeDp ƫnp$[ٸlwXI`i77HܽE]ov87PK+PK(GenuineIntel00006F7_Clovertown_CPUID.txtOo8x/ ?")^KZcE6NEZIHYYN~%˒0yșŤ~>GSn"ff<L5 _Kx*(4vXDL&hwjO?<.ع˧{{߶UTye9,<7 Iul3]g馿M.LY_FpN뢼 JQ7g~=jwY"m4%ʓ"22&—vhWADbg$L0 d`bbHDOz*MCX bxߧ> &F6MF RdHkb6 *8A7%wM^[h+w$Ф~{zg1?s4TL#JIH{Az0/X@cZFD&4v&xVO &G8a(-\USW|g/lM{iLit)VYZe ?UYn{asv:3W]/k;d1 ;cX8;;;;w$tvvvv,I`;&#####pG`yL{1 >[^6)BnjiIڼD:3x ˁ>l8FmZ'aӾ$&Tq_]쁭/f]A$q_gLTɾ$V], $dB~ +R3"B ѽI+$ߗ զҊ=ϋJ%@$Iԗh.@2H B ;7uQޥ$kk%=}.Kݛ2"dxwPK}@1PK-GenuineIntel00006F7_Kentsfield_DDR2_CPUID.txtMOF ḢRmF7TBiġÅ뫱6lj# 9L0)opuJlueDE4G18\{Ngɤb=`C1d=DSuJx~tb.4~ߨpi^^p09} G<qHԺWy%pP|-wԷm\!Iv:6?yȁ8;t+Fniċ}#8Sff&xpMꢮ 1 z{tvtq\m~zؐ/?+~L)h؇ S-G ]qIbׯoKfjQ /Q-jnou<*AD|b[2 e J3Dt_ AD 0qAD (RhIˎKy QOj신%`hd 5.@[$y]ǯ&QU o֮IA+L[d{V$#r?rA/ ۫"翋Q1ʯp s-KrV3QK=, 7?(Yr"GN90%9,5/aDֻZC"SSEUS82ߛPm#+^{q_C~g,Qy 90IR]ʋÏ\<ѷ{@Wr*Mt`9pw9ށg:0s΁;x3w9plz.Y:k10 e$-' Aa /T> >(Xq!A4m0VgdבpTߥEĎ혠M:];$@HDAQ@=""hBi " d2-YTXqBb !tݰQíȁ Rw@"ѵ [|-U:qt 'K!!q5sR/tM\P/fPKR]PK-GenuineIntel00006F7_Kentsfield_DDR3_CPUID.txto-H^kvXvJ?0ZOiV>p:9ۤ 06IDZMwwf~7bMN7{&W~ /CC.qt~L&5 Ől5bzgusݧm|=ZginP}O_BI)aq{ Ϋeo}4iY$fy]8_Ynf?[8vrP LL_0@h,uLt63ޤ$5e5R$[2˹gWs*{SbJïZ{i~$IUZ,.~o쁟5CSo>yoJ"7rI:sO'[w9pҁs΁;s[os΁;?%\dA1QUN|Qybށ~U+> CdM; 5Az+>"d4WB2w̘HE H$hP c$l" (Ώ?TȈDb"rв=6"CuFGi NG@u{G2Z2)?PlVq:7QfښtB q]ʬL;pFfI~PK;PK&GenuineIntel00006F9_Tigerton_CPUID.txtn61R%@%Y5Y{7(P 8tbԑSf I,5?dV~׋U߫~߻Wy\}< ~y1|WMUn`mʐY$ •W ^Wق"]lz0FJ3ݘEhbFzogS^) ǿt(i,ʼ!l;Ogmnrɶ̔%EfNRjr]TtP{6MEy O%S7 F>ed~nn@$MݮtY+].g/[awaU"u0QrTWIOs^a(Q#A,! 8L$tB 9r(MJS1B)vL)= :&FE"N;&Iy.N)Zbݙ?g;|;.MFkrѻi'hg|h)a6{aB\wA3eG>E7C(ՕbρtS7 WH&| ³Rb(?b"Sd=I@f`X|CL[?&yyyT.J[jB{oٵbQO8GORnE-Z_|<'\FYV֟?VsߊRC9elf>O1P\Bh֟B?SR3)as^]o-@3? uPKGv$cOPK+GenuineIntel0000F13_P4_Willamette_CPUID.txtk: pnVXJC]hJ.|_kZZmB||}mp}- ܮKi>ZDc" p"}޶tƔ16;U&;Hm[4t͇tr[\.7 agj҈P湪-o]`Y.+G AR쫲N+|f0 ed;jH0SEҪ.u >\ mɋŨi; co>ZBf6FM2$* v $pp̠ؠ]YnYrD8:E^!mC'$ %KsTj]pg_+R\6wvoPK2LsPK*GenuineIntel0000F24_P4_Northwood_CPUID.txtn:xMj4vl IT8Ց^X 96$ݶOrҐ[R%u2 ^ u\o4Їih#e$Vi}e*M}J;fk#Fl!)MT ˀpW5LD;gE]nH0C? D)/i۷c+r^fo"G d],tCIAcLM%0B deZcOWKXMr(uqқėg6=!GOQfp&5hH5M6#DqB4 u/rNPw-2 ĭ?0/bgn+0zu̷naCRPKFwPK+GenuineIntel0000F25_P4_GallatinDP_CPUID.txtOkL|Fd0"BbH6IIFQ3g,6Yg[xWtM&zU`&'.,~7IJNj '? ^*jmpDY!Sx9tvk MĶ-i*$Ѥ&&(^@/YGv`flly`ƨkQ-2.,ꍝ{0?`6 F0Y"e."2dATJT{i2ٙ@o>T%Uk UעȞ! 9k9wҋn;2EZ?l%4ޔ,D<Fkfİ-prf<0՚{&2 D}5A ? 3s˷M)ޞؾ6"p]Ld<]`q}r&5m3, q-VrLĪJ.Y hY2jPNF _.K%W"ɋRLIwʟx6\&B'O3lWqX}QG#|:I5誦2h#s ۈih}n#αqGӽTĿ2+2K+s8Y,\.e PmJ`.W SmLIյ?PK8'E PK)GenuineIntel0000F25_P4_Gallatin_CPUID.txtUOk>~ ˒zc5$?B GvIYudSzmey ;zPe%<۲m߶9 ]tW2`h2@,*n[d2i`v~@&w.lpZd̄z CV@WN#n\3En;^ʥI ^= }}.7V&Jk2C0b6nJd LPu.E#^芽Z:$ vw5o0<ʆ+. KNQps1ʞmgiMv|͋>s(:/+\ !v|RF>aCB {Rh& PDBN´%}D*ɬ {t GP$/i9T#C1Pv0"9N=ObHj}X媪y .\n9&/+^xkѮwA?Y@9(C9A 9ng$ћ.$85£Uj#| H6JZ] ~[Ա-?RlBq[@0Eץm PK4ӎPK1GenuineIntel0000F27_P4_NorthwoodCeleron_CPUID.txtok>ǟ '9Mv+!.[[o^%U %oNj<ÓһwR{L+-7>pw68u!P'}@lH3DsRe<{8+Ys>y2L" ӻ/`!Q]WPr(^Eݚe|+,*9`Q6WG`l{q+>)M UkX,j2߿ɤk[\Uu4 7[|ДYGCۻF5WieB3"x+ēN{Gucm}JU7 Yl><,}=t0CD(qgc&BPvyzRW+MPDLĪLM(rΑFihS茘˜ns9*ݕJ"Hs^sD 0c#? 3@s ꓏۷1ýn7 D\,U qM" 8XLt&iQ9B^ , 1c]kXmZժKD _d Xr NrUD6`!j60~b-'0i"PR w2-TEՈ(v]ͼW׬CVBt`G׸lDC=lpI:[ ;{ɇ6ln{mH$vED…H᤺"uDM"3}S9"h%X" QL{ uv`y2EzLj]UBdj~&.P>g`h+פ)1 6'1i4M(rΑ 6T1b6>misU^ lWwy\nC.#75[e#rI?n>^eRmJQ9N92>C|C6b7B Z"gw 9?eWdWS.ϪH#(iMN6 -,n/? Lqqv~PKPK'GenuineIntel0000F34_P4_Nocona_CPUID.txt=k0AvNw'[H-ҽC(NI*) "N? ,LR=m^fWjnԢDK&ev$A ioh(ShIHccCR 4p_Y*BALE6{'e+Z]З{%?r\R烆J@C>O#vDᆢk%F`f -Xbyr ſr|u*5'U*.aKX9 .aKXPK~'?PK)GenuineIntel0000F34_P4_Prescott_CPUID.txtN0 C"q%۱ۄ4&46eMƀI^b-sz]owvpnVBPM%uAi,k*F*yDdY͡M}ڔ*jcc?;ē%b./J2){ORzP~L;7+2b_%6B3|KEEshNm|3LA̓Vky(PK,B&PK)GenuineIntel0000F41_P4_Prescott_CPUID.txtnFx#&<֙O0R. U$ڋ)$6>}5`l&qcs f};SVYW:(Ro= P*Chj:ӧli`C1d=-na?(q0kȬMY0_~ P/[|tҢ ,ֺ~(A2{l7WnL.wim+_xZōá u{i+M \|)ȿ|n-_~tG&>\gF9ѵHO&hVpUUg3%Yי1ͳp&8_1jS>؍6]ڴ2r(1վn>lJ8F#[Q}D} %1=$:/[Ӹ/c_7A YҾu4Lp鍤VqFlM vPKHq PK)GenuineIntel0000F41_P4_Cranford_CPUID.txt=n H/fp{AJ&J :<ַ˄6=IUų&Q\|~e!%@9^̒Ӓ;I!WFk{8 [v-ɭ/!vdw!>i/yOJF1DD:͓&$ԫ`$( Yx[)ED쌃cJΕ}G =۽ BON(F Q4QèQèkGPKF D PK*GenuineIntel0000F43_P4_Irwindale_CPUID.txt[k8 (ɲ|yc{&l2&-N[66CzC4;/`oWSyBJEO? xxިFE.7=UYf\컪@ aZs}g>mM*YeYxtDf_0'uީ70z{+j[B6תEɟRu=<>[k2GTyFܹRćX ]zmk.ĸza9k3Yݬɢe81lG.\{Dq3) }D3@iL4(MD,n"RxD<<)jڑ7"N%Hft"#݋Uۚ[ca;J CzJB`#Hx ~s3dL"Rx}Rc"wcc7>D?JN$N|Dэ7'A֔4UXT'F*e?NxLslkJ緹9rju^V[YՀWj^ `6Kuo*U^f1BA|5oI ˧Ia[}dE("#h;: v!YLr\d=$:29Dtv#sУ]#ۺPy5JTmΞ84`&G\OP˵*yX|PKl2Dd PK)GenuineIntel0000F43_P4_Prescott_CPUID.txt[k8 (ɲ|>ı !i0ZWm(Yqe H>ܨW۲i/]d̯`D)=qˆ\MFnb]=G#]L8=p"L3* y#,rYvB٪4t!UˁRuw_ѶFMVj|3o=ϓzb/0zs'jSBTzkUg"WT݌fm5^~f1ѡ)wlk4FgOmkW.jjrݰ>䢎n\,&o8p1l-xH="Hy> }DcAL4(MD,n"R:^!# Oq$⍈SF ҡyMeiDHw"/}U6FxZrڢB0D,͏4Dcߜ2p9%.c^č'0t]CtKsFw$rnEGoD2ȶ|$ ek~z>!aP,Uz 8R0ε1kv/g_i&Ѓ6rt >g7?t|3u*f ֥쒨'f..?ࣦ &  L{ n:@]=@#[hBdg X^ 'eH^F4/9]d]1ߜ4?8@+lk s]:Si(=E}oX'R˵* բ7mPK*1Ie PK+GenuineIntel0000F43_P4EE_Prescott_CPUID.txtj8 ~{BdYv c6BҖa.j7Qiqd1U@X·H=*J6%|m̊}!WDޤtq/O !VtX!LZ6}};^Fku׋}vQpM0SpHBk/<~g07[ Zݭf*uU6mRVwb'& E6muƦmn=BUS(zv"`:EZOzqSiw2* Keڨ:?˕f6?o `M^C^?.?}ousithGƽ!.qr(ٵӬsW wo׹\q#eFp#vw IT< b$'"zȆ "(8MHqgىE Џ}DJZ]#Hx"ዢfx#Qtdv,ٜ^d6</Z+v(} K"G~4D8yyoɁψAg,z/1N#>nРY"aOGIim]$8_܅uD}$I٨ 06y88B.buf=ir꯭23\0/ Zꏕ|+ڨB*\H-K-]PKS H+ PK+GenuineIntel0000F44_P4_Smithfield_CPUID.txto8#^Z 8?>t A[5%wp!ןlij$k?_x&3ܩbm4Ol˶桐v BHY2GاRVb->s>Z/-rbKf;>D*^$^qD/F olkLRP.V*V*רf2{T=\*gZ֘Ζ?)2W?hM M`2L=dR'EЄKTPF'l9& &  ̩tt OtH uD}d>$uv r?8A+lk szB])xLs-F W0T.vOPKzH%7 PK)GenuineIntel0000F48_P4_Paxville_CPUID.txtM0Hs.`\*vliv_eD(m%G6;g:qMHCV-Ym7&GԤ"*DۀL5̭mnxtVy$E=zW4I(.ϴcnlFQE=ܞ+cj| b`"(MU)e&;՚iuQV$)$K5v)H?uGd#!gE++=Jįϩ{'/J QQQ DAD9b(reQ(BDA DAD9Q(J! Q QQF(r QT((GQ EQ?WPK% o5PK*GenuineIntel0000F4A_P4_Irwindale_CPUID.txt]o8#?ioZ cv> $A +m5h.i6~̯_%!(̮,~^s|ཀ b6;a"+Բ=›pίAT .i:e=`}gcuSe8QȻQ畆=(+u u0. O/ MԺ+IvRݜOSU.b;7]Da^n4Fٺ,6qY=es^5{0||gpDeM 6IZZ6bvY|q5fi*Q {[?f{.x)\Rrx&&(MTލ:5:OiT˵Ym[s^&vN{,/L3u896"|w^prEitV&B̿B]~>2OI}9 KG8wmG]{&tAlTv\to~H* t)=Sirqؔ^kIb[2 e {DD VFď#?S)&5aװkj Cװk5|5v 'PK$PK*GenuineIntel0000F65_P4_CedarMill_CPUID.txtOn | v@ꮛ*R&m1e1G D'B6G[@5hBk-k]k,SWg0! =} k걗Cdg{^1_zʿG|ϐ,`{bs e_2BIHu@*$pwBj/- ȟ9# n؀3bwPK d PK&GenuineIntel0000F66_P4_Tulsa_CPUID.txt͋6/2QJI١`JԱS__8N2-E Ez,N&uO2Y?h|, %pcBBj : !Bl!G"ې5^<~Ո{;EkPAY~=ס#׸ $L*&K,I@L\Jd+Ĉ繁]w=uwC]qw]wt]w=uww+PKCy<PK%GenuineIntel0010650_Tolapai_CPUID.txtJ1;aL2M7}"^Fmݽ|$c۲?}:?'+lO>'&:i FZ4ZЉ !  a (icfA ޖ!:]8֦֟7xIK$;hT!XC!M!@kHaסxO'<W󥴢-PK PK%GenuineIntel0010661_ConroeL_CPUID.txtmO6Ww8ހTWq"!-In2! h}JҔ ON6 \60u?<ԎYݾµ-X÷fd8]=s@r\$KxccɇVpbq?Zm4cRJ.LUw7vha]Bl\ G5"}G6\ٺƫ\Y6kϗYu*vӳT39c^&C>LuUn ynf똖#8;cyRwTDN'plQmJ[B䅭j%΁߳ ⸍6ϯ\+/?Z>uM9jiQ70SxptU].)]NԤ[._dڛ_[l\3j@I 3IVeg{w -={p^-ʟdTfya?\mno:[ g w'M4m&Q3cHWwO'p@ui C%m/+=]ٯ"JO4A:$N5CCy2JNxI>Y"s 1=IȸCI@hvnpo¤ptݍq]6r6#"} ' _K /܏ސp<e7 7 /!$FG-K!+6-?[,^|%S\=å}xe{MOp0]5 z]Ek,FGT2S$A`x:m1Gܩ9%IvR]?n ~'7&70 fA.iD <@Win6ɷ&/6_Z0_%&_7Rz}Q6!$~Y]X^{0}"VfIM>79xd43UdmYTk.&z H㛷_VU[T~8Ivq!{Wﲿ͗b88v+b{uѽ.]&*abj{>Y7ˌk"(GFP:JȈWsnDۂ" ԈeF< 8㞉yNEJ騸2Uaa 8g:'A$X(BnٴV$&TQWOv9]I8~*xKUUD*&(J"uE©DHB.鉤<JDؕPu "Qz"quEut"qݗϵH~]]B>#9n Nyߊx8 Q KvܽUȖuLMgvl_l~ 3J'ZIt:an>#[xHcIiQB 9r2i-(]xѢ'tg#g&ݲgEbR0(M6'f[`(8Q?'+oYbȼzV$_"_iE E+A-g)| WD!JAd$yZD") S!R r"= RxPZ%•L'MO^TH?)uCcN#HgUQAc߳׫EUCe$/l#?_''X䗹Ft`ov`ց:[~<ו-TɖוQ> T#4w`aSĆOh{&]DFu.hܺnJGkxr$ C B*.XzȒd% I7? }1x86\ 1HHruA,!\0-}Pz~h{e¦scr7=ۛ[[f .f=PK PK'GenuineIntel0010676_Yorkfield_CPUID.txtYMoF  KDT8r`F\J(Q9RpޛyK>H#6d[T|s'&.Dh~_X*E26[܆iuŘI=ƲRKp&rޥwpgxv\$+ At_vmGIGDg.d.&L_bׇݥ!p0ɶE[ s[ԉ{FBlayT-Zy"1UI$-Em..l5i)=Y} Ujv~ԢDVrLj|k\/iupuD&y]$ vm"h"%&*PR !420CǑq!1PSQ*T](kapAF 2{~ĞMTpMd3h&8ΤBHNF='琜s53ȎtIyC2D?촇G CP!̑T,8C"B)QC.ɐ3%5BRT!p#\q0 H8rd/ #t$%"QhZaǨ9đ)--Ldqk8!_"Mχ4lM?Gg.K>3o80}If;pށ{wށ_ҁi;܁gK7鶰ׄ2QOKK%ZO Ab^tkk|EH)E;B׆&귢 1* r!AخR/ $*!TU똠 PD"Oz1 $jbOڥG uʍTӮQ%ء yt.Oq %PM6\LPƙ5TPMEqjJg*Jw*=KT_!PDdIdBѴ'dMUʼnKʅ̙Yi|?a#QBE麛/]D[ dM#*5s%M`M`M`M`7{=-0~ f&/7555uܿPK3(GPK$GenuineIntel001067A_Penryn_CPUID.txtO0~A/ahfd#,n?k* {pryQg?a&J泛&-Ϥ/k} t" (0~CJi 6``0 vA2{{jDiK3`acV EHn5*"du&EH;Fp!q t?!6xNm^I\߹vJJ{L~ f |J= 7!|tN@1$^4ALW@CDD$еvY9.Nij 7巽tV(B*T6?"xG(PPK#m& PK%GenuineIntel00106A1_Nehalem_CPUID.txtKn0}!韇.6]7U*PCB v<Ӏ(8xg|._F_?? >#7"@@ʋ5kdHoA,S8tȦ3`,e\Y QxL |x}4W^!^/H:Bؾ5Ho6wJA;h-#J.ӸLP=TB0I{H5`SFщD; L$؞!EyCl2٢nE.rv^|Uȣs PKg1+PK(GenuineIntel00106A2_Nehalem-EP_CPUID.txt[kH 9sJԚMJ6ICALrVۦ~͖;{dH9g$B \tϓ|-{y:KY} C!{J&Z!3! O0NnÁ?э?OLM᳚'0 Rه!I9;Es> K4nl%8}R.%*en%',]NK7~XrD}eP y>V@ iufE΢dyMeRpJqbkILUK$eC\""6?kUzt}7vKƣu|JNߓ~oըhݲƞI4-67N'Ki|SxT;?:i@$җ)d@-kvD"A{#⅁za11 "%!z,^Awe~WC=蘄GQy<S^Sd6 D&S 򆉆k똌.{ F)fռu@-ܧ>&{f ND`MvSag|ivnQN._r|E|a//+"4_4_/b͗c |//_˱El4[F4TF@C ՠѠ96AAsnz4\F@#_4!4ͱ|И44st44 Pw"Si_eh=iGkK5a{p3e&ZM9Nj6%~PmIZ;e oxFCBm-ABEKboy%~SbY,x*Ŷ2nIX[")aْlh%ņ*BZYF* VEZv΢dTT&3mW͢pf*e-&j~PK68PK(GenuineIntel00106A2_Nehalem-DP_CPUID.txt[o8#;i_R_0ihQմHy`Se7!]B:|$@Ӧ>ɜgc*]d?+^w.ohQ,ýJRlT{Jfɤ:b sj>vx`{8`2U0N25j@`@-)oD<ǝѪ7uՂtetL]ʥQ)f.Nn6q,E`Ɂn89>4\)CZY>x'Qf:U)8pul轺> [ 7Z]%@X8.MIP;% <⺞lH}&Y% {?_%ݧ^\lJ,C7vCšI6ˆdGL)i%-v̥2! }qld?Zz.dTV>矌MEjq([ >mx PK"e.PK(GenuineIntel00106A4_Bloomfield_CPUID.txt]o6 ?`7 `z>d5 Y^hhLۤ~$ےbǙ5MX}yE=7 )py2K|t;.1 .+*Trn'P~pzz,zeY=~v`}y" gQ Ć1T+p9}@9?)g'I<Lfm&7|緳l~)CޭFC9(bR\{tdO7Dу˨hXrVHiugEtqE2JIU/%:⩪$ee]3x&ƕFD(}q|8`]%{wҿٷYU.bU:.Ǔ"d2~XxpOjGOqy^@lKF6l!#"\-]/;:u" H0a0LBnH iwytCQL|흖Ix@CDA%{ȇvybd6 ފD;L<5Mee:K7eHrU=w١ҳ){6 Qu$)XEB֦{zNoos^JJ_(%̡L̃ՁeXSR[Z92l> ΐ0,;-Qj9r"7#O[F[*^gċu;T{qCW|9_COqW)ȟO$U`W]3&ٙ%_?;-S˾/G_%_˱H×C؇/$_!Eibrl|[҃$ 519}@C h h 4֛h^ 71967e@c@se@c@sl4!4!.]2US+=PQsI藆:`tEk N]fuI-%!"ViJ"h!!q'Ca󚄺\lP!qwK݁ݒ.q.K;g)q,4YS"5E ƊXņ"RW7~]2 7BkEGkIsY6ӱfꟅJO8C3>*WMGR"St B&d1v PK+8PK*GenuineIntel00106C2_Diamondville_CPUID.txt]O8+;_8FzTKWZi4b iʦ)W:; $Ŀys|y6Wf<Ϊm5!JΓ<8S)G.wibwH :Yy;0.5Z0柿ec gCB$Nci:1D`QadD&{=$V$(0fM14zHENh3&w:Iv-P侧z="=tB֥=1zj3v(Ax0 &X!qS DWʐyLXDp3 = #z%K\7JDUCTp(zgqʏD)5- ly1IeOl6eZi^j+oLrά\e'wt`zO*mV ~Vъ?ZpoMYR[IL(!|1vb"Z>M$虢=#,#Ya!}+vҐ`d"|a%q;+NHDE{ .ARPI.MgEMfhx/"KcC>_"l܏%>"QIB6+siʥN+V'"cv*{ Uf.`DxwPK}PK*GenuineIntel00106C2_Silverthorne_CPUID.txtMn0݁ ΏJnk%QC7Y,2!0~e~#(8zg]0bY!TW.y%4XLnVE\Ai} K 0&=໐x~2m w!wdG5=:>r;-L/3Дv ^HGQiO$[A}X( '9i MC0cL_|&ۖcsm%+$BZ7L-4{j;oBoFlVA͞E|GGGG/#>>>>:PK?k=N<PK,GenuineIntel00106C2_DiamondvilleDC_CPUID.txt]o6 ?`7 `z)X2 (z9LU3YN%KӦ֛IF|CU W:&l ;xtons*KxNP㑯]xvV.5eT\yvib-5.JMa:جsW8 ᥉vB$jɮ4$ *"U&_7To=Y . }d`<nU,tQ |48?sET6li/C8WF]spvI˵ՈI˱r'7S߾Z+/CRODDvƣ~k >exԔ E@UqN;xMV*-tusB>[ B˵tJ~ɶܺ瑙eG%flk&6KQD$wiH8rb?{"悈}r8J NOěω (e &LggE ~P$xOgEV&Q whMvSZETOFF乀3&5uuO`=J% 1saCX!sqfBP!`naƲLđs CQđ,fsgbY?T>*bu;FT"n-xtFP՝vK+d~'6n7DɃ-_$ӕ|VLr*,IuKnїʟ1h"?Š`ЃA=`f/2toJbԃSN=8/rjsN=8ԃSϝKKW@yP6.ıĴ%fGG_Tb|aQE({)}5:_\¥M;2Չi #B6ÇTU|EH10%1O6"(:HT 5B"O}"DfMF-șD6@bqNٲD\8DP-2tiF3QPk ;t}{ CmDsmF) )/u~*[8tz4ɚ9 {Ru] PfAmێGPKլ8lPK'GenuineIntel00106CA_PineviewD_CPUID.txtY[OH~p})ÞcK6ZXE@>̆Mq(ׯƎDŽB+m_FdLV>wƣhVn l`{zR!4Bo;qO83kq4^u{wvF/Ua`fAZB,Up+y 6,2e׀B׫b(|z4wwY~.8MuYlM”ƒr&v ٟHU#E+trS|xkM*bC/uvt~\e}tyv\lo}m>SS4L]Mo՗xQӝđoƣSj/֥Ho_I!{8pzgAz, faqҥsVՋt:3W?#UM@AzAw^%НV'!+ʍ^JMzPA)5Rӟ|PARu̦Qn۪>z&$|uRYL_|నRFgpnnuiBمzGzE! CR8[raj|$HгkaA1=Z܅DqJ3=HVI%}b%q+7@]*I-~K3.7LBdl PK\`PK(GenuineIntel00106D0_Dunnington_CPUID.txto%#M#e930 Uz[%OQV.$I+~8i,%|6ghL>t5R3G6M@jN%^%_<cw|KV?h7"nEqRm g-Z.7.-4΃mPYҦW-UHFEciVf7fFY,{V'ӫ4B% @̪gC! RP!eo@ev(v9j7z^| B5!͑.a6׌/h#UiU'FOW=kJ7'y.`9+Jr\W}HIJ,&gN#$]R+x(IRK^5UH=G|6v;;eH0y Q?Zx" NL"9%Jҿ3CĔBI8'&6_q2qq%,Og|.} _C"_8 ޥ/}A_lD_З"E/K|i{/E/|]2E_З>2m}A_ե/>/8ա/cK|9K_ }/mЗЗ^Ҧ  }/N` _/\@6 d dr?` `tv!0% 0=h^> 05A`#fptB`>cB`*~A`L.0 .3A`A`LY 0}&hL 0ӅEhEE NWc `tv!0w^Ӧ 0.2""C`L+^Ӧ 0]"C`zL.2.2f_]Ks3DQ̈́ZsE>_,lD|i9eϙ ^}Ew?KLEI@*Q,MD 2p*spPX`(}Pmۚ*ȟ~^h3z8rS\W%(JJAP .LٮD1ԧLi'}.LzJdafgc#yK8p ^}=ksݤQI yK1:ެǣPKYʝPK(GenuineIntel00106D1_Dunnington_CPUID.txt_kL{BsfFVaSvY0lH$}_~I3ju!s>,9OnOxs[ǯ=o>}bs+v OmoO&V_ݗZ|*V*㱎HGyc\%QXw۫gDTBaY̪Й@Wt\51ϔ8&y<[K+Z1Dࢩd l ᾶϚa@I.6WkFrؚkևFC[Mncwx|>_Y71%L銉KqMZHǔirL,Ҩ-;1fPq/@cc}}X&W D#(QimP)ٺyǿ}}|xu=cbZkdSt[uuqԊI!T2(TkB*,etq:VZ07ox?)r!"m~nښ^^\CݦbavUV"G1`nmE˖]/}zwbd7 [z܀#ݗ^("W,xC3x!,!"A<$zSD<"^Ds'GOAq fk ^wLkFˌ^_[klkVYyoY[f5{Zsde1ݎ-s5mNf^sۉey`Mtg:.v@a7`w$S`؟PKON PK'GenuineIntel00106E0_Lynnfield_CPUID.txtˮ0}/0|]]7}W|fNH&,2Ac<ϯϰW#4AbHg>{w! |cRyeqYL.pCGO&$!&CG`PmQ< 1 ޅ됊!( +&F@Yvxt{džRMsM ݆5bBi#|1A^ ~н*m(=igz;,zNa=9Ʉ€*^ ҡ,]NJ,Y K/w Ň!*TOColX6 sxfO?\:-pi[\:WTҹlKRK ѹt.[2pK \:-pI5\s\^RK.COҹep. 5\ҹer.L5\Z%˶PK@Kv)PK'GenuineIntel00106E5_Lynnfield_CPUID.txtNF#t{li:* , 7 np.qbg"0Ar3s<#*^ZgdsIg,~:/0< 0y u:VZDaYgWO/\7,0Ns=8$>Ƥ? 2?My=S&zzSOv=Y^1IVCy-&ˎJ:˰8qY"xgq'"x^$L+^;8. qtuvla4Jb @~T 5)NXi,Cq}fqzѺJ}Loq*S]D#Z~NOgw$lmojv*s"nm !/Y,_Crr8Dzk;q6ZX~% ?ᇽ? bCCͦpYY58D_e-~,~?|pR6HXY>j-,Cr'WIC?y)~^cXY}8ԾZY"iy^`88(bdG_*ͤf&4+ZJ36!ZcYbyd-ҹ1-Nl3w>VT+.]2uX.HyɖWΧq>; 學Fahչ0QTU]jQ:k]q#) U.aF6$j-H(B'(D$nJTKbD6$v!i%vEiJD)?2ښM6$) vv:&;$a(iT_/$ ƌ1j?,{Ӊ2B'xzN(rCã|ix Γż/PKRC;PK)GenuineIntel00106E5_Clarksfield_CPUID.txtK0 } ${;]7U ׏i8ݝE@(7׭UҘL3!Y4i!DBi4^ b[Fw׾V1C VyTXw7&\H!.]CTeV1 >DMHJ(~؅l 9M;mz}Z򙑗3L5e:z&UJ(.o ;}e.[b\Yfj sIdNUn% IN l)h.\HFPX #0VD22 "ߴhv!;pPzn K + 9 r8}ߩ4Pp~ѻ`~"k}sbĔ8i:ѐ! )tsP#C LJ, X@N ȺGX4Ϯ $@5dZ#{%O(]!) a˲׀s,H~mN ==PA9xh EHW6ȃ[R|cM&YrNrn%iHci>\P@5|1PIshG/wC+M wмabOW뒫..KޣKDVuYuy]]Ze'tUUGХۣKWuyh]~PK1tPK'GenuineIntel0020652_Clarkdale_CPUID.txtZ]OH}p})󙱥J8v-hao:N[WcljmB"mh4xι_3#pHy}K/E՝~;72:fY9r c[~olrȴ7D穎ivhFq.-l/&+4+l HPRp1_r~\y ,^䟮Lj׋n36TjvV$ٲY7͖E-Z @͢r`ݸĐ?hVNdk3/V6[%-˭!.?̝]S88=vq%~>dݷ|n?'UdDd$s]tm-S{^5A,tu׎ {I&-kt~? V錋ܚ+@.M\t-/d$U*9*"S!m"jDc2q< %r %1YIA/ ea7!y萄4DQB;$WS4O{H<MR%I֍u6RʺԦ{ڠO7zIKHKH8B!7hH[Db;׿QJJḢ)adLgHD 쐸\*!K,gctH\rUBD[Q uH?-v[R$>"7,G=) f~k ~4b X.g;%_$Ը.Kg>K{ՠ3? *:UO}"? ?y #^"? ?=K~е 2ɋI:k!:ϦCY:DɃt5|ut5P@iXTrHvȴA;;WYLE!"SP$FjCjV{n; _B4"n_n!\6!&m6!aTC<7h6$m(J@MXDo #$:aB=IQ.; kA`~H؄h-ǐ^/!ZnuAhҪi 2[QMHʅ5 [EGk_C"3ƹge.G!.3_ܺG%6]&eoPKwՂ PK)GenuineIntel0020661_TunnelCreek_CPUID.txtO"1.wePR[݁ɂ{߃ œCt;Qan/Ϥ~Vvө;vU?߿ G(KUQ yzgœkz^(=P 4E&vN}L*ZIZ76Bz6SÚDE gQR(Ѭ Z< t(%LJ٩. \.c0SSSds) 3R(*2ܑ[7=sT^IW"A9gSQyzfp$+\ߥ#0u.9208bȐXMo$(X )܇'j u.5r?~#[l1OsmdPKÀd PK&GenuineIntel0020672_Medfield_CPUID.txtoAHLA>*!HSJH`ףf-qyo~stOϏ=azU 4 糊Ƈqr{W 3 <0ls*)Ԥm\," ͱ[GrOA:Cj02i Pz tgasV[6[l Ho\9(pͭk A"A! AxTs=À9IMǛۣHD:w_ T@*v*>_{v9y{ꞞKYGkުF>CQw*>`dK股3@MNӷ7PK|`oPK)GenuineIntel00206A2_SandyBridge_CPUID.txtͮ0Hg~l; XꮛT.;)I껉"'ė<׏KgӅRk (.1$+˳Oq}r>LqOߩ$; ،@!l HiYS mp\+(zK 5Ӌ\;X ۞_37171Fjbnb~1Ks;ُ)1{EĬMM s莘=\'PK#]UzbPK)GenuineIntel00206A6_SandyBridge_CPUID.txt엿1k4I!͌tk K.wcr)5g۟>;_|r_~p ֗1:)x6,G'cߍrg !L84N'iNsJBc H0cJvX\#[.\m}QbKQ@ҕ m;} b.06DMԔHy D A׾X W[\$4xmߧ.@װ~6氖CצּEIo:6`r#s!RfIqaŕk4cZ=UV| Hֱ6ZX@Q0a~8C ҂M*i=3py:zNM5`r$̅*~omt|D}Gcz\j O?8]<+X|s\\8+fq/8``|X i2o9OGՍBE:&,[?Q=/},Fg"_L = 窨N{b!tp;$^N5$;!︎u&"͒+J>Y&U;:?.*styz\U/_<WÃ<ήaˆxp9MfLJE,Te|2MHXx2?,<8_j\I| UgM\̒/MCݲw*[H_KGc|'&{$```m1^IM$3t4t|tdQ7:::-k鸏M$74|nz```m1)^IM0t4t|tQ7:::-qH``=````m1)_IM4t4t|tK":&CGCGCǷZ:ciLLLڻ`R7LLL@L?ū l94Ӛv[`[Fa(5J-ͼf])ZfKU3[])Zu[_2>T3Γt6OtQ'eE%[M(@5KRh8DZk *S8(u] u%vqeMnv!zId+ BKsnYL:-Z,ޡnH FGnIP8`3+Iq7wC6$ErBE/]KGEI#]ƙ(\ "aQeZQM"+2$!iDZ!iǑNCRH†*xHv a# ]>ǎrVC( ~Ci=kFNWu%o,K2E"EdvK&-3Βf8Ep)CǏp?$y<_ |ׅ L)t]B_9oPKğCPK*GenuineIntel00206A7_SandyBridge4_CPUID.txtˊ@GKnqH39n$?I}xx2O߾?|>˹ӬF>L[0-Ld9wB B ` 1w2/ĹS P߁ (Q -0tU4nECs'caBU%(9B6?Q:pPFk7lY*g,mR/Wa\wށ{T6¥,I U=4PI2IܪOj՞ܻI|o7.3?}Yi231ƙta`ݗG0o3?O["m&b0Ab)gcP$SnC?ޭ|4zYittat[Ɵnzq]Wx6܁7𼂉00 5<6esq`1m`{ t1t0YM«61yYmE&*LRhLLۘxddg^H X\p_:Cn1uL0SD/$`]5dd&K[Iqd$dѧ j2A-mt4Ið8>q & XB})8S0㮈'nLƛ&we&Tk:bi`ݺ<#zɥZpϠ`iW/ԏ?U)*'J;/~rvnck;vܲ;*[+tvFKpCġ&ppCġs?Cx4~?MOqȏ'~ ?9E$Cġ&phq8tnҏ?E$( "4?N$( "~i48IAġ'OAiAisA e9E"D;DQBH;D,Т q3&c|PjƜYTKhF(ziһRș*&(+Rcșʼ 2|"J3lqgED(1kΙʼ [K_ [ {[hFٿ0Ѯ2mBn9ؿ0yDT̮WpH[Dz[>̏FC~{4fWD+/%Ivܡ[k[smhZ^2%%*m'/,CJQl[bſ,{K·%RjXR=tBV%z&hk~^9em9`[vW%c'?(/T-U0ym-b͟O ܨg2Tqpl1].ڭPK_Z rPK&GenuineIntel00206C2_Gulftown_CPUID.txto8ߑ,K+ǿ tIHvѵVZCmni腰_rB aHJ%'?X/Φ$'NsM:?;?+B(}v8E2W< t1N~"[u#yN|rqo~x4x-׈ k7oO8O[Uǎ22ܕ3!hy'L̏~GQCDH„GFi4Dl #&7UO,,2cZ9E5zh @2LXMD6DJhV4h'ȞX.]okr*䶽WrTBr| ~9~zSx?p,,C rr8DeD-~,~?͔ojcslao>Arr8^ 1!ˡcߊCt/ ncs[X~[m:]8\-,Cr+}lY~6fcsqފ=lYv)[g9ttR[qed,~?Ł-9:o>A(r 8KQآ8ˡl}9R*C~7B,΂ @KYز8 c7. 4m>=w9 GQCJ1İIB y^ZPYM6׆k^x*Ţ&kCK/ [*b&v6׆j^T?b&v7ׅHۧcצ#m\U4McN W,8·9J( &Y&LM̂jAD-[Z7 $ 3Eg4 Ž3+&nBIH0W37-:"+&aRlⵘX5j,AD).wъG&Ӕ]1^^k1hb2" _W|S -Q3a]U憸${ӑ2L14NgttL[ x̦PKXWPK+GenuineIntel00206D5_SandyBridgeEP_CPUID.txt]o8 ;saodc;XNA:jN'_ EI"`Gp2 |2LyMG6f7^y~`).t% wlP\wv~ߵ8 4^>guFc[|/]&ihd$7.vؕ$y}Hw3!z&.MӀЛ??qT#FQݡ_?Af? w~_]-Yi{'y3L+EWQ~8ߠxOOͣ|/vfSX̾=M<#~HICK({\'="c)^7 ҡ}W-JKXҲ g#Y/zh~'!F^(^zE- \B1!XCPM/4?FKp&c}Ben-,b Dk"DO%D("DRYn/O/LoID}eQUxv!wFG/rLj<>I5Wli?ڛн-SD~-1b$W_Hct\V'Vbb̑q:B#Ȳ,"u ,i.خp2~8^5{,4SKw/҂hr³ 4 ȏgx7x9r7lhDR&zL2᪙ :O9d]9/1+ K_ Y%4_oh mi"-hkwmi du@ 5˻YZȶ@[mh[-:C[]m.VԢ-kcK+>@V4.dfy!k-li--жVm@[hJ,@Շdu@ 5˻YmaKkm}݄h ښ]S-N",@ kwB-h mGMh@[YEzCYmi],PuPVe@Yw@n[ nup 5;z'D66>P(M(@YYI;"J >6h[]nNQv( e&E@Y,P,$ee>VOZE[-,$nϞE,Oˠ<-P-^D@Y,P,$eUFٿ~Sˠ>-mR nfy'q{(fZjlP( 5;IٳEQM-TM*D[-,"nكh%jMJD@Y,P,$eUF6Pp 6Q[n[={PmH-"@^PIڂ( ʚ坤ك(¦n{&Uj "-pkwgmeP( 6)S[e@Y={PTe[BZm/pۤNmAnNAQmԩeP( 6S[e@YwPTujԩMD[-,$nFZujl:P( 5;IzEZAZm/pۤNmAn.;(: e{A&uj ",P(kwjN-:^Iڂp ܚءvrv~ս F×׫TSٙxa^J ebI\PR/gAgbK[&qeR"KܕmElĕ!8KgGxdW@tXWXIGZ/#-OҿaJ:tt% i. o(r'a~ ƈ446jQ#e!X91B#Qn%bE 'XLqjMNDLEQ4Q+Cj7Uvp,(ʙf`B0IQ$4 ,t:,]kGDNM6t&5/eOss&'LDQL 8Hʱ"ߣ9V2]LM]=T`w|񐚜Q޿#C2@keo eyc [f1<^@QLLl@γ!`2o`@0,:$Z^GY2QPj(*;bBʋywE{tgO3Y5\yq~m< 0|uPhqd l_E}c&Q-OY]>%i\By}2ˢ.n&$6dߕc#)zpc)Yao {Ot3mUBi~ o2Oi 7 I‡O>,7yp?l^X%O+kȮ$f+Ɣ?~LF ))x-"NDk.Y=!.xv&y7Cf%pqL.37@cXų7x~pq}kk-S&|w\0yZ"7f@s=^ YPW˻d-7\b1{|4}brȹ- 7YsH曥aAZ|FUG!ap O&ⶐlϙJ <ƈn07Dn&4 QsdA1m/(&>a %OjbaaL1dzD0yDgPLFm3YP&QLҪ`K<ɭcLD79#&fݭidM&xeVL1 oM~bU2i~TH 6/MaPLmR n7_8l09CLaSfٌ n59ذSlhH2nqna$ZMDԖݘdǴ {WD6x>(Xg j9K<@pׯ\>,qi/٩|P;۱ \),y)ddSӖhjڞm1UMS-=5TCVC KjҐՐՐ"dK! [Zii{omUmi-}--אՐ=c 4d5d5dY㥐}-ii{5jҴմմ"mAeYjҐՐՐ"d͗B9IVVӶ~%x=)){ujҔՔՔ$e{AZWVp[դqqqm?:+ to̖ݡnˏK3IeZB[4ukQxk\\2MAԢ(45eޛUbFilvy_ 6Ipl\}8v=BVer>w*ƤŅ WɗNQ>-Я 4 -רg 3ʃWX(Z/$ȴ$HSIFCb5%6ChMBlB-|A+[5#jEBQIJ67%|h솄6%DQ"y!tWh\nr5Iͺm) l1vHhwJ0/ڤ&ad)n>K|'porjH&-{{@ FC܎"!i]pCҶ)[Sy"!~]BʶZpsOR ;@ԳuB"q,ՊvN]HMG-!!oZ;%"6[u4N}WM2{Yft Zr"OZb9$sx |e7?=&g> \`K0gLn@]8PK YjPK%GenuineIntel00206E4_Beckton_CPUID.txt͎V}/p]6yW:}iTeWO/3pG ۯj k6KrjߝPJҮ%Q$L5OaZ2-0·Z%׋ ȔpAN%4C$gS Y>.vR6*yS\~sl9HP\0TQq!yeˋq[h:=߇.~|?2 5|;} KE۟i{i914·s[N!jJ6Cy}$$<_ CV֟ϗI%{ K _Z^OC6Kw\FK\F .ReKxoq.5\fK\2%\j,p ,. \¥ pj%\*dph.#%\$K\ZHv *..2]¥KKt%dp%\zYlp .;\¥.Q =.;p˧{'Z.wdg.]piOåKzpKK2ѻK.ew *.]¥ .-D.U\һK\Zz%\jdpl.3%\$K\ZLv *..2]¥KKt%dp⒝qteg<3*.K\Zv3;pᲰ3,᲌!\.å .-;ㅝqTqI.]pi]zp%\һ,.R%KtwY]¥KzpKKлK .=pY-e%KdpKKvY.R%%\Ғ]VKTqIv .d.U\3.WvR%;pKxeg.5\6vm;\1K咝qteg3*.]¥ .-F.U\һK\Zz%\w ..KTqI.]pi]6zpᲓ]¥.%dp.]pi.;%\$K\ZNv *..첓]¥Kv8\dg.]piPKdRPK%GenuineIntel00206E5_Beckton_CPUID.txtOF}܁ T߰~]6U"6d+,ަ\o?~dwW%TrMev\οm )sv!Aĉ_n\q SUYd prz )N"O,۵Pp"߆C)6;凡: 1D}!q2;yrU͑?LG݇{{qs/.SJp:֡/.sJpºsJ2סpp/{sJ2סpp/{sJ2app/{sF2app/{sF2app/{:a/.sFp:a#PKuPK&GenuineIntel00206F2_Eagleton_CPUID.txtݿ  Jvf$n2Ɇbn$oҪoo\iapv߿v78wgLNU״]mR}{ C\twrtXiykcƩt8ٵou/yjW#N_にoɵkLOɃT'z{ѩs]}} 9qvuq׋k}jkװaz|]owT8ǽ\7!Sa^ڱm*i\rOîvuWuת]å1j{SS߽>=u]^o~8a}=:}?dז}E_u&N7-}w7зF_US/ז }} FE_u&K7-}7MoзA_Uo#7Q }u۾o@_O}-1G_[ }-u<cu<c K}+}E΃-}ë}WoLfխ﫭[(//WFr_cں>}Eo$5﫭[_B_r_է(}uOB_nO_-u3[(/[7էh*}u%m<:}Z96݌}uK}+<4t黾uOD_:O_Q硡`L[(/էyouEm}Wmr}nF_o2>}EoKkLխwe%E_}rߖט[PH_r_է(m}黺ue놾mZn]ݺe놾mZn]ۺ~[};:N.V]r7n}׶nVB_:O_Q硣`LߵǸЗWy<wmvt%u::+[[[Bߞ}'ѷOfխї}+}{r_clno}}Wܷ'5㳕З}+}{r_c.o>b"uC_}n=[7c.o>b"uC_}n=[7c.o>b<:}ɵr'w3wyvd%ut黸uǾEut黸uǾEutl,no }Ncr}݌]ܺ={7@_r_է(=wi6žE%E_}r#1}nS[D_r_է(=wi6žEe놾mݎl݌黴u"uC_}nGn]غ=b<:}Oɵr=%w3wa}K}+<<wa}K}+<<wa6euNtlۦ[ط/wH[tї}+}r_c[طO_Q;7ݺMo|!}}Ww 5ouїWuغ7ٺ}} }+ں l݌lݾľ%=y@_uk{NfխouwWH_:O_QLطtWÙ΃1}[o}<>}E3[vطr_U%VnF_ηn~(//W^};ۺ=žE%E_}r 1}g[طO_Q{!5lїWuu3l6%e놾m.l݌u{}K;y@_uɵr}uu{}K}+}E΃} PKrc}^PK(GenuineIntel0030651_Cloverview_CPUID.txt=k@3?,Iwgf$-3Oa!чF @{0z`>x|~yxz6{~|{3|sSG; {4](;Q,PD{/ikS\QlEs 0 "BM*J^OxB)-jۿR(ɻ[ҥ5@s][^7¡CT:Du mA*71ay KU1h ) cSQezep"3:ιz2Q^ TaX2bu[G{>͜чq}nn?ZaN}Ha>ZȺ0U!00$IyL}K J0)Z=T;S{ `0m|L+HEo=kວoRC/L/#);DIgTC7(VZK1 $ 0#H CivD3$VYzUISUSUSUSǪʮJ( PK,"~PK(GenuineIntel0030661_Cedarview2_CPUID.txtXMo6(J@sh\wQ`fbum9ld)lzidh 1zg6+kf8&O6\ơ'ܱ6_pl // ldCɽ&T3M0z۝Ƽ?jx|\w:Y B<pBӤ 2R5bNmi8?xYooxs (ݢ4v+yf"L&lUFnYī&IN.9Ag4U Ĥ{*iՁT_GýwiR59JIW?O% N>e߲t8hE}:>pd ,p0k\onu2"BE+{r{.uU/zݹ0Mߒ]61\'K@>'tAД[=ncyĶd$-aH2"‘#nDd Ӑq~H %qTRF`# P4%H=5>KbiJ=%YMM5 گI,듞4~K[H[H h3SAϰUw^0J% 1sa#Q X)HBPD`JB2p&CꑄEz&.b7'vd{L&.6:Wxn0aEuwe,Jb| tq g!zy]gϫHS+q޽^?_b 2Si`ꂗG~%J>_[z>Aj`xi|8x} o`2ç4٬K_p0F̅r\q77׷Nk}b.dSOy+ǟCǣ=%d=<MGB7@ψR6gYzw^Su(_yvfezj<8_'c`!JY-]VNmLZ-cG/]\Ľm\q:ߣU{ƕےMDZiܧ)U / A]JpH5hx=[z# j=Mn6(r'7I<%Y՚Dڠp?Y{MUa9}[cLzMȝא1P)(! ɫGBb?Ҟ$iv+K`M;()h@8TYDpFc1)|nc4X)ȐXt@Zܘ2}sQQN;a] 7bG$Kj'z]spp:~`-qL߼ IE"6 >onqI/&ҙ$^Hw{_(#(?( ;)IQ_UQ؋E'E9)O(5"NrRWU"E?BQIQN)|ȓ]jnZ-tRҥ@YP) Nrd NrפdIQ*"1K֛87¢;2#8:Ynh3-~w֔0(N=M7!CN/Qa~@Mݐ`ʄvK@,M:(  ZYh@)BQ_G[:\l_ s;4!JqrGHYЄ'ʯL/p WdnoϤhjG Ҁ`c#s؝d9n!$5aAi@0tHv$@R\XPC /He\ Vk( ̹H#J1 M7]03B)avKW,S = L"\|Q"{vQڣ&DR<%7rThQˀU7ZhKzJ*Rрqb)ℎm@z@{+nT홐ލs}}ǧ'[5JK?3 -aaQR01FH! ;6bV(@zf=APXӵGnvG6tym.-cqd_OV Fxs--(3}qp0u.y^h33*?מ B-(>f;PK7)PK(GenuineIntel0030678_Silvermont_CPUID.txtOoL~zT3SaHͥGTEjK?}eMaia0;k?nW_60ioW=u gգkUZޯW礆r> ! D2 i"6q&idFdc845[z6i dd+c (fm&FISS{agc Aӽq@~X;N 'Se>𒣨^j ρ$%If'OyDg}+> /G顇z={엚` `A\c=Z!W9}j'ӴUEjPV99ZRa +h-,am:|Jh bEŋ t3 a)^-Z{AH;iJ<]h{0p{taSŽŽi8^9{7]{jqoqoW^W[ܛ.̽4PKPK'GenuineIntel00306A9_IvyBridge_CPUID.txt_o: ; $@ x%Yj&-B(|%iJ & =ϐ!ںoi%|/{|q'=?ROv*Q HWIp%UuNh~wvkxLEhJgP43p?N07q~E<.,Y~>Ag׷)^,Y,Ow/VC6܍9=gF*t:.U䉾)N`<..Š+Hwv~tq?GC'Ǜdz1?fHA%cܧ/E.Ǜ,~OW/Ϭ(fiGDA̯a4ܦ|.TY<>]^ |ge)bp߻} .4O<=l=.|qMY1If&Grэ˻G7'w+t\&c L6.pe# E@ d8B ,rawm&WjC}צ}۠;>oSaJ Lw(gGp_b%gzR>R8ii/N3MǛ,ٙ#kvEw*{ K_ Y |c2ӖvhhKmhѶm-Җ=5^iYڦd;ȶ"dK! mG@6uhѶi+E[lYqdmSdoK! NGێ!Mm;vmEgі+ A=@N k:v nu_ Wxu;v}umhѶm֟]OFa^M64Ӛ]Fa(1J?.ͼfmC(1J_Zffv{ kQdc?d(n춙2_lJsc嶢-wWY ~MRGJSTU]Q(ZQ!Q"E67%kuȐ/à&$=UQ3KYQı%w$; jJºD)v [;є(G_@98BXG* e(}O`s?PKJ uHPK)GenuineIntel00306A9_IvyBridgeWS_CPUID.txtj@}0M8H;I@w%UQqIl!N'nnܷOwps>`iSc |bHG/M֨#52OF.eK_u)_gnO~"ip-UJFEX^P7BOckR972^䜚%Q:H<-EXEN6%zIwmt4,YDpYF\S_u1R&ZGpqy@H@*Qc,1x%^A<#U$ 0<}FR'Y?7#>qo>h>1\?~ >&%7 > =&%Ȥ7 l&GבooAbқ{^H#ޤ߂qg`{?,_G& Gޤ߃z%Lz~ 퓉oAD|&OPKG>,k/PK%GenuineIntel00306C3_Haswell_CPUID.txt\o8~70]DQ/ujLng`4x]_ J-R8w&@V~P/ߡ[ֳb 5V5Z-?҇ "_pISMnbzܔ>C;pOj7nkOM*b!/\]wqawbv@0V,]WM߲E}4O7Mll q5X7tF?6yNz 0܅842K9.$C ~<λD0LOt]e>-ED(ߥY\tGj2qo| s2ƘavkCJw0QbmiQ`X0uڭ p8fc(n ]}nywy!${R5 C׳ZY5a9{+)!se9+ptlUPTj&l*TW7NNszo@0u6>_Ndw:~t 6qklW.!X.n,[@>0oZ*]*nY~MyWl:On0J_`5j~w1{|e)B#bpP8.1PuV/ r\cI'A U0HL0L $AS㐨Abo1:]0H\cN(AX0+{b.v|c;Y29I $S;D0YL#Ydf2P ˡ$aN 5%JXZSu)yC]Nf)8D@ Ċ9y E͝Z1sHnad3~ݨ>VK'-ɇP~|\r_/KcCQhqj$ڇ@C!rH8T nM%7=fTCe.4BVVFsLvxfL-J璻3.D,~˺ 8F`IaYlңOȦx,A8>䩪Nޅf|y'7XHA%Nyo佑FޫN%%.QFյ 5:Diꍪ7ިzUSU.F޵ 5;DY#7{U䝾ĥ7ިVc!U痨:oTQFUTUK{#ZݹDޝFyo佑G;{KhTQuBz ..QuѨzꍪ7^UuvF޵ 5Ȼ{7\7PAˁs{A&29G$ ZBV_YΑO+VՊ S!;']+j {lʕ2z-EZyDp RU@8Gjg!̩BJ G+$>ZqK&QR>Jcr kN"! dvL"!#| "n8tm $Q/B5qN!I%I+Sխf7Q C"R \%#B &B$ "%T( nD}qiME5؎&kr0I˙rN,Cp}D99Hs*Pö9BDq9"NIѣ+UȺDnC OnX]+Hɩn<`#.HKNX\haCYunS:R pAy-zB}!GȞ !*e/z]GF$P?b N) Z8C%Ac:Ǵ!&T?Ât6 R8, g3-Sg_p[plH b(͉C ^TkVBꇏ X3,i b&cnEOpXHfN gdgC'Yl9Vt1͒Um~k`0|Η/0 A\K1vk4̿p*[q(XwPqopOʤOX7+70F]4azgXh5s^ԜGUg:a70'Zo; SsmV̊ʳ|vM;0I[-9V>i ڭ(~Ww?ÎYsO?LϒiA>Gt6;-63p]PiW.vzόLS"3= #(~Srl7G`#0hd;kPKU M[PK)GenuineIntel00306C3_HaswellXeon_CPUID.txt\n:}74yeL#&qSҦ,[:102澐\i]K6_g|+޴[|v;O>A0%"vDltt.vQ c!< ͬ:yw!\l`&5M!2!0'"8]T-}H?ɄOl~(X^,vb5.hiȖEǣV Jt`8ځ8s.]E/_@2  &-Wl=xMWi砄/?ڿݧdZ!C.Vk/8d^!C.Qk !^TŊR? W!{ȵǦr />vXfskbYbWt97 ֖1BBJ +v*$s&&I0fCb$R}kX;xWP_8RVXy!L8߱)@v@ E@-÷ ̆(Atমf 'w$aISUH\1~ 5Z&7g@νRWfA^z,A$>I$6(g[ɯ^b NT$,Z ABV9MciAԢŨg>yXj ,,9V ,H0Ij ,fA9TEk;5B%u5W!>ը Qٖ"uX-3Uq;j,.,e{Iw@06 d"Z fAv:U`A%g > PD2I s)\ ЂX; X؂C;5;|߱bw' u*Xٷ*a5['u+r;!F B R DjpQ$5D&D.VfMs{.@ Xp}m:7}:e<*~)pNd>; ly7SA.>Oڭ!\9lSPT2wT;1rBa|k{{; PKۀJPK'GenuineIntel00306D4_Broadwell_CPUID.txt[]o:}0$?DIvlIz"j6_Pl93Ùyd8\Ί>3GGeq[f=ApRWg8(A@ P2r1V~ yPE}r?<_x|tXdp[ bL \]7$bH7.l8@\VbglZy97b=[U]vUNޟEYL(AeB⛷?묪cEED2wGgeYˢ8=>ڦalxz| ^A4l1 8{»q&xTpԺۭ;lT# v>pUK`t1ԃG(eۙ\/j"nnj\MN΋iEʊ7De>uo%vy N.ruZEġplTWSaQ,W0^W,/#|򼸝My0瓇.ɗ6TU\ݕy6l>nXuUmFTבtKd$WȄ_9nѰAw=J)H4 0MI&$6W")AL1tҔ4AĈA#hA PEQjw.͵ % nij#*9A&;$;MD9 F(ِ\fˮ. s`I_+`r|$p-ّlgn_D5\c%mƛbsq0ܸVKVېiab/ɯ3}iZC6JdIdĞDsȝpeIomG{ tVA"j#G <A.pc=3b>0tL Cu|qSƔ1 #oBU$;*Ԇ$$QD;!? *g lr9|˾C\Y} }"{Liϳ|c3G>ͻlpTbQn>:e"eb/w3v Kd"eb/{ zDsĎLdOW;wP%W{Ƚ:u:ա9aGÿKD^&fA&D^&!2q32栗J&J".͟ᩒhIbM-2=D kYaV+/4k2o!U69_lK-QFLjTmUg^Qo& UO iC%!e%ymCt:<&i%cGJhj  iHSݭg@(a46c&IRk]dSقP_tܢ37V68TgH w7JE 1C6XLԛ-"5H|0u程AqҮGF"gI 4  v6$ă!ȘXZI#" \BWEedn!Ri4MeJڹTV8qjh  Dջhh%1A.0=3VVl+ 4H:čZ`m JrN5J!fR[6G[Ա@ *X| lO?km k,t݊x`}z[19U 1f3KZ{F VPnZ[p_rPnr/l5~1RXXXkm{nRU6 fb)vּ(߆ZY̺ -TsQgIb^eR:ۼAFbq+<F㣋qG{%i/$u л;U*Bm5У0~2ϛwݟPK:/^;PK(GenuineIntel00306D4_Broadwell2_CPUID.txt[mo6 aw"J2n6hgmTGcv7_d"E ’3ΌćZ;j_qTd !)wg@Pd,̗榆A yBƷpjN߾ am!fhUp (s8+F?TPZg놵Xe_łV"|\{ҫ'˗S=ϮMmT$&z䕺)`4 &u'ˮ KyaW+I9u l6"/CΗy|=2<>D%@>}^d#"G"[uruyy~\B@4rYWxl= (w` 㗼қ@с(_۵i|w+*35$C8'Es.].TG~~]5.nVOUL~VageMep1yX˒Tԁ։mjh̿,yܧ+`<5oΛէ,[U7lޢb18}>*fTCgC-[:VU~ud"I2!—χfjؠB%C$ni$L0 !H bv F\5 B0HBQPF z&~&7h@fGɴ,AIfv2YȲ"sԁuX R*efdMr]F#єx/ɣR0tZ>"I)D@bdA;몘Fjk]xl.jj5y&:ɭO^$RZC6Jdsg[3ӓDp9䖻/yHSqRzaNq펪(XDm$6jk>aØ'#2 ΐ̓ܙ;g|θbl8G"P5;S.vd OܚZf|YڑDՓTt3iOpdw;?J&(=COGf XWy_o%Py.y*FPv!s" +0/6lWWRi(y m9jB:Hb V$)zr9Dt`:Lsu+FAA>eux)@hCFkmcr!#Hp !{JKBL|md̲!c!9`k4a ƨ-xظD*HQK0` b| vGXwmY=iqH bUDO0z Ge+S>wŚLfEc4L1u&AyqUHobQӒ-uZ>RgKVw~vn:Nާ=S藿s1 ItYZ+k$S7 Xɞn'bp wr{f}2"+Q6_'})`/J\PƸ}m6΍qQ_ZǩX"رa\R+0 q qPK hCPK)GenuineIntel00306E3_IvyBridgeEP_CPUID.txtKnVy}!D:J!T{,K= /0>%zg>1 ЏuB 8l%Ęcb l[۲/Dy!SqKp^Eq//MT箬1֔SiLeeETKI4i(!֟~ Mԟ}? ܞi8qs J,5okDzOG4|7tDI$O%kyBs4yhFhߨy9p84珣/8o#8sӜW8sW mpn罆6s87py9#]܃F6Bs4hAIy9[hA[mhnY+ͯܲ mhnXX {uq_vi4 ̓'!!aM_*;N\ ULM{\u꒏i >r/ᯢ,[d]'#_ &69C<<vtzZ<C:G)T'8YT.ܧx!}LE| /Nmb9 08GE6M0{:h>%/l>gH)ƋUz?ߔd\eE9P"?pq_DbH?6x.[`$Cf4~P]ܥE<9GMr?9g>OM݈Qć Kp2$|}~|x\E#lsx|xA8>Ojyx0N؇PMGL,QW@ΖӇ jtV|<Ãѹ?y@a "h<{U{D3U^Uj.wzQVN:C;CDX|NffptqV젋:U!{b\aϦip8V*`Ytq3$|Vz2M<8K&_PU6Kk@>'h8ےMd(-[ȈW:[Z ]":Ď(qAL[")A1☔"Z X3Motj&((U yy'%\]b}l[35N53fn!Y5fL(Ӳ) /PVO,MUjYYpkצ~;%ί̣1Mhs5|ekyu"hݱbfQJâ*X1$f1مEowG;ey&:͍Xㆉ k,ۢXuW12JXqM̃.aŘ#Cb3 ΐ%#-JnK!s gC@e!\!Gx9 GؼuK8gM$[MTM4mևG=ٽÃSdm ~\Lj-+Up;%7Se^o̒y Ԃq0} ϥ|fdjpVb/w^ #-#5a;}"PŴU0C!B <9C!oBs)^p#G> p#G <9#oGN8^㥈0b(Di1P0b(P3)z.KŴ8bG,#G <9#oGN8_㥈4b(Di1ȗP4b(P3)~.KŴ8bGl#G <9#oGpDKPŴ⼄BC!B <9C!oBR+q jZL#Kp58bp38qVx+ 1մC`o0`'2g0cnjz"#ZMix$x G y"sG"E?2g'aG4fZ1>s QX% kk_ 3y EFi%+٪>sgd%lO ]1}.8(Nk0g,Gھ[r˱28f\iTCq*T:%YѯQ]u>m%ܪJa.aUl0k{ת$ʎ< 1w(aTDvF _h!Q.+ꊚ$eqbP׭EADM7$*q5kQo7QบQ_RO]ˍj.=& =hZF0\$jJc$nNMM`@,MBkyc Xo:bm)ݪ杣E $(%#ވ2MyMI&aq8#z׎$‰銤\ 5v !$1hŨDEwڱ) kQ)5IOynFճ*(YmŶ9J$Ơi,P}*7#TnPN'⊤{rJ %0ǖB*#iK( 0M2tKbF(/T?\R4{#J{!OSڱQ%GDQX)H4!"ME>Z<8x5:KKx98BPԁm nG.PK@} yPK'GenuineIntel00306F2_HaswellEP_CPUID.txtoƖ ž$o[chAt%ֱ%yj&%n)_?ȧ93Oݯ[|X?_+gg7d%.) 2ggɫW;R4yҲj6㛟6ŵ7|׀'L2^~=#̗d| J\'(}Y5[=>K7riwwCNK2ٺ^?^ع\v],zs%\_rA^n^UoSyɶ_zy׫ ?ݮWՀ|7\7Ͽ(fӼ֋_nV^~^$߄_ YlR sjHF;r5/ yo_i,߼!ߐ ~~(3J!̜]Ϟ.?]w`$Gym@fŗ?͞țլXD&xñji?dzߦ&75 L*ɏrT49%׳'r}Yo8-_F^Zxr^F>= <$aM֋wa@ظx w( tAda ?]]邤A.tA0Oѽ[boɽ[2e1fOj4Ϗr3maNhQSo>wϳŻt5)k$UzL=*zL2޶V`ϛ.TRj(MI>Gy0*A|@RM%tSbJ}ME.HSQ v!]S1zeipk53+ 3m&v28IԪLw_.k |W5?AyJ0QXY`gn]Y3r)_% YA{D_ rKѼhtl8&R4]!k1m1Xgw~asaMx:xjG#/xxGk-!'R. C80 Gr"CZhxĹ &<"#=t#C+>`l! #K 9y Q_!-Ex<\GTQxY:F[DC!OP0D7 C葥<_!-ERxĹ Mx$G#ҁGNGL6" qx! `0B,01$Z i-G#OPx$k#x<GIUU 5$8մtW!C2讂C! 6F @DxAx@ q I$Nyմ*8$>pHUUp85!8Ujcҫ`J$MWW$tHW##`Jz!bb8U 8jC!/88$N|5k1¡1 @DcCc@ q I׀lj2Fg"#`J"MDF8DF"tDWmi5I0%} &*#*# kH:G$q򫌵@$>H@5"8UDZh@gDLID I+mF 4  DhCh q H@$NZ#PS"i4¡4"sD'D8WIVV 5@$]#)êh@ LI@ +@ ΁H j5VI0%} &22 kH:G$2dX"DȰ ȰD"DʰV[#aS"i"* "sD)Ú +@$>HVV@5"HִdXA$HȰ ȰH@$"ae;"-tF$F!Cd]ppHC,_p)qQV I0%}&J#J#kH:$GEX@h@hLI8Ј8qQ V$>I  5$]yTu$dF!CȌHȌC!U`qH H)4QPH\@9 9*Fc"#`J!MDF$DF!tC84F$HhHhH$ _l1b!'bpC!ҁCNC8H 8WIUU 5$8UFc`J!MWW!tCWMH)4_U_H\@9 _ZhhhC)躊]W1XS8լƈ$>I  5$8UF@d LI@Ȉ@ ΁H "-F2" DDeDCeD"q I$N~6Z#Si"3!3@s jH 茀H)4H\D5"q@$>H @5"8VDZh@iDLI҈D I+mF @ \DL1@Y:H "-F2 Ĺ dM$H@$ҁHNHDXl5B LI@$I* R5" rJ jI! " DD5 +D I j5VH0%}&2)dX"tD"eXUȰH)4aM! "sD)êh@ LI@ k V@5"HVjk2 `J@$MdXSȰH@$"2iȰD)4aM! @s )Ú +$>I2 kH:@$û <(R!t@7WIao`Bw`:$e0Y(C5({G~p,` FQS++XkQw,nZi(v xGϔrdUo^eU̿ 4*G_SV92*h9Uܿ)m2*GߔQb#oJS?S)X(S`O! O[(?U{.ӑ[(;!eU»#ZbV9 |I9Uһ#eUһ#B(V9J*ԟ*G_QXP: "NGanJV9* H9Uʿ)OGaoʈQX)9\V9j UZ{G?U: MAZ娍wsAZ娳PprLwsAZ嘲PprLwsAZ嘊Ppr4U?Uƿ 炴W\V9*D *Gߔ炲7eĹr4MYOM*GߔԤrS&ecB5)3pU\&\zwjR1Ԥ5wG&ͬ`&ͭQ;5ia{wD 5rd̿ VV"NGQP: B騭rdMyU̻)c)ʑ7eZ2]'zrQōeǶ}!oof _O4P'riQX˸}Ha K]iu:Mؔ}ͩ;O1,eӡb\x}U=y"xO#˅eқ)e7 S#uo~Py枎Kv80ȝFPg.xIsgi6.aB1_'3=Y!rWWq \Q  'Pl:YiC%.by_ܿ51UhrN|?.!=>:ˇud]iB#\.%K}J@o$=VͦC5_/.O'OKSq*3[|NnOvC9[,'tTy Wfd: .5f4Yx 0DjSAO SPW~a0[p4̲.'7'iSBj\--̦|vu3(#]BRED*}Q=B)ԣq8&8F)UT(A4C'I1)BiR$(R8#0;W@iٞym0 r0!SP)XEZ/'JASJ"`X[goX`㋪ EE)hND0-c,2\xEDŽ?6]DQl!k;jՊ۴pY`j! 111IbȳG1cyyĸb mxEAA{RIU$$@rp@W|u $_E-I8*GU@98+jFP|$}6WHHLdHx#(R[>pHU!!rpW|!*ImI$mW9" ^-.FP|9$}6WCCL98dC:8AUڒHڈr_E A 1 [ ]*rHmI!mW9" rq^Utp0$%_(@@b$$@UڒCDU4Q1!e99DEyNL|`D*ImI$mW" I3U"ԖF|U*rri 4_U*ImI$mW" I3U_E-I8@U@98i&vz0$%_(@@b$$W.FP|9$}6WCCL98"Ԗ@F|U* i 4_8AUڒCڈ _EA1 䐃f~#(@R[>IU$$@r@2Y$@pyR^n\Y;$y0ӂY]jQ6 ª `Q\9")8ZS\9Xrjn]p֎ܾ(GY#/ #/Jm#/_Q֎Bk;r ֎BZG֎© ֎BYG֎­ ֎³R;r_\9%R;r% QڳP; = vGcB(vtYh; ֎}Q6֎}QVBkGǾ(BkGǾ(wGc_uQYtN^7rg' |M#xW>QD SrNi 4["ɿbՂFBT[A'M?hGDe Kq! V`@gApiQ &VI9 Q9d&@*wAh{(@Dľ5(,0ݑs#iҀQr^Aq;>o<4_i١mOҖ+z >4nSKo=J31]\q$G!F%($ih#O (A@XC4 2*F9)ў6BT߸{  ǧwmN`sbsuw6nnW9_ͻ??׹twΏ':Py{PKP8II5PK)GenuineIntel0040661_CrystalWell_CPUID.txt\_o8}pK.yIQbwl\d3@&:vvf J#rXXt%y/9HM5|)b՝㣋v`YJ!!*!*QT'wy d7bY|]̠lN}"|~_p%< Φ&^XZf$@|mA/!zxxo|^>N:ź@_eZ^r}JŐm~/@6eg |~\R@CG'N\O9*>DˇjiYɒM)TJvw|tB7plsG6m &Iч+x>ϧUw >~qq?}WCԛQ q1[MW:zlΧvϸrA%C| 2Οbgl!3}<~׸s5/6+Aeprߞn@ )U1l9!\-SSlK&Uz}bZq>̦r5O@PO? @|j|q;rmj5&#'.n\-Fg^igT{2 H}/j`P(U?,2eiEYfp\rI,#1 ķd" jJCFnQ^ijn:H, IN(6H,{&}$ 1H"yuDm ɚ5FoNU'èNʥ )>G[hL5DU |cb9%[ҦN.. P'QR/ J6 [YD@02)'PImj*s L!DPQڎ#FS{C[f׵|Uݐd+%R `K6iMuq>+FsDE@Z-&|=k= 訷2ߦM|)%3 8~5x&{e\?{k?Xkg.nzkﭽòv|8c轣ۤ{G{k`}?'nzkﭽòv"kǷ8{G?XGS"GI;a9ZGú[{ok힋ۤ{k][e轣uzۤ{GaﭽvmRo?o᬴Y\~mo5ȬܲA`# FidE;ш"ZAEdwEFi'o.rN^)O𩸝X.AJV*U.|Y>K=x_ ƙ*h@½&0ՄF&$NK"TqE2C ;E\DYH‚0{,,  (oANGQ Q =$(&Dy4!RfGSґ5iGgi3AAF"6π03c,XUe ;։U2 ym!Ҁ, HeH|3Jy3 )p",3 uj%YCzKK="V-dĐgٛ[POз CR YZ`+@rN挒V(vEMH@jԄjg(aMSGY&KjaI"T{݊(%Ѐ(4$`"Α Of]%+BzDaGoIAP&w!$ky)=O:vߓZ FiXKXQS%K;NU( kڶ;\$ccV Ho!{"HPCb@fGtn0JZ!! ]Z*ZJ-X~[,ȖſΘYOt':Z t':':':g>Q낶1g€n4)i[gx7l[]ٛOY^&S3}qnLg>n.?PK\յv _PK(GenuineIntel0040671_BroadwellH_CPUID.txt][o8~p}I坔].VL6ngb4x]ۙulPS(}H8Oכj+''էuPȗ#G` AMNOty{]]1)'ɍr\.?Øko_Rccr)\.\!/)a/8c `|dS1Wt@s"~\J+Λm||OO.vknOZ^.fhvf\)~ SM6ed1>^2f_"o4w.:{{l6='؈W*o?Y36Ƙcɥ:Yegӓ]*Lӓ׳pz &Pxd<ͻoVwؤ~ f×tW׀'!L-ayek)c R%$lx2Mz5]W2w˅/*WfXh*yF|D+ bu9;oZpvsZoi+Vb7c zZ6iȧ yZWOd-j&1\'O)`~S1_1O/#c\GJȉ\!J Is̓Bf1˜`1F*8bē FcP3ɰ!8qJ!3jH܄cN(Aش0+Gb!`\۞L{ɤYL:YH$CV$ޓeNfdf!<':YQeLw ̲%eY*lԨj>) iC7+fϺH)؍Dj vrۓy yVرIo +xQs-Qp$By'Q!"ur}A|129\#уHCn;OA .˖>`U!i#Qs{zR-C9HpuIY =b !c3& !0|KѺ>脙ѕ5W5QQ*HD̝wTHA* S]NOQM LnӱQ%k fu;O? mk2hqTC٬0 .^6o 9[;)9VB^z,"8Dj~8Z4"WLnZ __IL-R7B+Vh֏ɬBf}Nx o9YTȢ邬XVZsU\)ӛ64lӵ\LG^$/\Ozl/#x Q)Ɠ F3u0QuVHe*$5FXŅXj–S3cD},B)>RRĴV Gž{Hp$( !%GH?@A x߸iAWf"+5=P ωwiA8Pc Q}@YaHFqlAʕYB0"i2DZK(oQbATfND7o7HL!jVN} H qGv96/A1 ghRF-GAU!i->o cTĉN#<69 ͪZV7=bAa"XD )+AbE}4QÐ"/-lHcZJL]nίVC(dÐLơ1JdK =HҖ*oS5Abf#Ƽm} #鵭6d" -^Cےli͍7sRO?"&Ԟ_6C-gŚŦkV B–lU:]\m>oTJ\ng~u/AQy\OvYwN7x  pF4RFMn$8ge3o"06۵qǼre^ AT=ȳս֗<|HV{oz\rSܻ͊Uª=X! Z1~b%K2+l̾^t΋Qq>dn%yt޿S%V9Iy]>閘2ofדq8{Kw>#p6 weY*o$Tb 4I]FcdFZ|doTi뜼WdVO1l)LAeE'~YjQXk'l v` °ɯ '@Zf`~fm'@lRH;.9Yۜ3`&d4|b0SfL= f`f8Yc_/mnj1@:ZI'\dp}69>$ O2>$O:>O:I'`>G7ӪOǩ2M}F;cCg#=d̲>y?49t` O6>d Oէߏn2=?PK2& PK)GenuineIntel00406C3_CherryTrail_CPUID.txtY[o7~7@`_ L9aws!Bȥ:j"T [i#xH5~HH&DZyY5oؿ}~v~l~8c˫W 3?ܮ7o-g֯j eU!5W*TRJx^ͯv6$Fp0\XQ;^;[ڹD3rs ީa-bs$9cx7 9f;,vO&*O A)81YL1* \?{UCtZTIE9j@# "R=< y;{At~֯{C1d0E#ʲ[u/H@eAlO׺^>fU챘12UNK9-$/*jֆ  0l`(l{;r bH ( OWd>UfT${JE2K ?Ҿ[.ǽ]nY^}X$w}Uww7Wv SibՎ=>fM݈͐0|YRv(/!;tH_CdNs,:JvKȎU'!͘s9M!C+vY\zpRD{ܠ }QAV$^%/ *MԈtd%ՈdH߈dKfO!Οx"(9Q8G.z )!1DNգ\1+ɵuh/2wr`vqB_{#nU$Xpj}R c6hwl`1Xquq`EuecyY!7e,- ݧM]%sc^lgA=2*?,e:jcgeMﯿd9,U)ТkȌxp8áu j\E-Ɓq 8 ӻ쬆Ah`OJjS0{8]|X6<}ߏM,r8]9DWlaY׽i \/lq[wGxxpXZ2_{!/2='=Ȁg뭿8IyDi#FXFPsx8#$qOW|9r9]-%z,XB\0ygY^@z:^7DݐU)l6ŔӇ1\dӏm^.I)$ݸ+p eF|15[!s(GLEqJu3_o٠|c!2)b/a4 0M[$>E 4vjh[vCLnHp}y=9òOrDR0MHd&;\e=mB\6@nF ۊ*Rx6Kې1=(H)܎DlPݳd6E6u{7P !1QcDe{zpvzXr O}`ZNgz)?%_ֺ-]FF ds]?& =e^TvG/;Geg_vzٿd/*;G/;Gʎ#eg_vzٿd/*;G/;Gʎeg_vzٿJ eY"]RӨYN#OEw;ȼA,dI)uD&]~;[6Sd=(p\_̳i Ao9 |#4Isƒ&D֛K"1,ok_m4!Qܴ__Ijt5|wFkI}Ru$,v%H,~eDH/AJĀpQ.NBd@܄{ &ė]K[ߏ4 gmH0|8 UvyHґhBAY;ң}7! C>K4Ѧ%V7ՐҊ`*NSRk #jA]SbZ yݒk qeK<1 y#ī$i(^FT{Ү5 ֨ QHCJPؗJ{zPRاh/zzpP8NXNc1DN5w18(]HNRSo{{zKkVTrF1v*:IqBrɀ&蝧uUz/MX #԰aHtD,SSwXm>f $>iH\_Q}`کI57 #$c`Q)cp#ʋIBӆ1#w7_8sany0ە/5 vKE^|XbE|1ϭr&I[k3*\LJ77EZh(8JJxe5 GIS>^#MpN,~YȢI#cV_3*C UٺZRZdOLk}>ZdO'Y듬I$k}RjWÜ&33erk}rk}rk}rk}rk}rk}rk}rk}rk}rk}rk}rk}rk}ؚiOnO7Lh1M}_1>Ӹ%9MfC/>*TL4F2TyhY]1>Ǧɴ֧֧֧֧֧֧(wv+PKl =PK&GenuineIntel00406D8_Rangeley_CPUID.txtAo0;`89ɘ4ةXIP$V.|z6I[آH9:]qznw_jo.^: OΜL]F֔\mv_asM hP۪USWM4%MQ+atlD2]& in \F ǔ.D9mxy{~gCv^p@;j:*b/yKJe nbXVO2`\~h8fo=Xn6`.?~Zg`-7wgэPqZeRseU̕[^=}^?C46sHP5q0\;WttuJ"X0re,A$!cH$ -Dhd0xoXbHɢ"Xb.Qr#(DV$;VXvuHDn.䑘s1?GT,hۗc"J%{ꑊ9+vqnb9{py;l)'݋aW:w'ޣB&)*CbJT+>'(HOYF8A|x2%D(Hs=>b!A#o$}޷ʤ cy׮ʢTJvkQb1x;UXLĂ.B\FYrpYeRRƳۇhZ0* rN@)Qq?Gp ~5W]#2Qu!Ԕ,&d_볓#GEzz%+@识wyq1V-KfW + 1ŠOvSvnOV}}~sZ?֫TjmyPM//^Oy+yyM5Φz(Mu(L5TlgS="MT7TϦz6gjqoP<{P=xi/-f/={쥏^^zҳ>Kө^|AMgSSM14TgS}x6`6ճM)4o}0 V^ʏOCsWV=1NּEfY_biJt_ޱw9H-&l k:vYn+'F-8&e}de1Y^𒃤;XV>(~:]s ËBy&d _q G2) 5d!YNWCU 2/|7 :8az}dedQd1b /#Ɛk*גRM_@~.8PH  `d+`#Xc_\)! 2+F ӑc!x!Hx_OHDӓ!4gR|IGU V3B bs9w~*5j ޅsif!*-Q##$ok *(0@tiV/bqD ͒:wQHsFxi9}9;ߘ(UgTGg\gRgTRgGT)) &w˱lKF։D)HAOIGQHL0ع+xfd?,8 9]r|b$uh05PKu{s<PK(GenuineIntel00406F1_BroadwellE_CPUID.txt[oH ;`_l6c5l'@l5$'NAx%2 OV!,gF$jre?l` y*ƑKot bGwȓ:Ԧ?/s7?%û)d"ʖp&nP,;ƫRo~$ 3,^^,6\_k=:=d3A83~rdg~#`gM3p&s|~\&1$B>~HҦtxNn&!J |woWi:-ۡC80:_mGcxz|ހ?zu|4FąP/Z Z}HmDbEQy^D("/j&6K!W)BOF$E}j&>fze>B]§ @_[affifQܧ%3 ̼na ϢPV(1YF6NZ)a"{<:[-/wk-;VLaR+20֔L6;jGvX47x8ZE ֺYEگb3]u 3M_lI30PdHws#!7i*&8hkǛ#{sii!{4 0G2f+XLE3$"J§:I3!\r+Cx@RJOuXu+la։ڐk/ܤZMTד4Y=ц)Npd/;> x'cWw &?Vi~O@ ϵyӷ 7lyn&ծnt0΀a龀Hs@<1IR4Xi7R"5hH1R4hHѐs"ۉKl%23] 2sD >' }!ECřvk E~)rCs!EC )>')HV0h8nz (Dabn1hD/ V4hH8nz (!EiHѐbn1hHѐ!$E)JT gM! @- @4h /hR4Xi7R!18 )vL!ʁ!AdH?HQVmbq>msD >' : l%: )gMCH1hH1R4hHѐs"{WK% !gMC5h1B4hn_"_t33hP8nz AEŠAEDEwbe8O \Sbۿ93Ӓ[x3JQXk/̼d}D)he,̝)Rt3w`حQZjfvJfܕ--Gھ[3si9\%_unn,4ie>]yoACMI_& :TH,KTexi+^?KG"nS„N,Ia%Dz ᯔ}_JI٪" u'h[!̵^pY@(% uDm|Qg 7_&Sw"qj!mH{,m櫶u]H\Jl?U%JtkQSQm VQ10$)}̮H¦D2YDrQ Mo+*͜Cz% J.˔cutD:\6++\ `*KaE1U$[3Z*6(EQCQR%}q"-Ip(H6K#ABiMRypziPV$1ňV$VY?*j5&-[Y(m`;Ng;Πg E۶hJN:>I'\tp}I'\tp}Ҵ>YzJ{δ>3);FClp}'\lp}'\lp}'\l_pr]! 5g>nO̩3 SvsN]Qدn:u}>7 ~~u9>O>>i}s_PKn0 PK)GenuineIntel0050654_SkylakeXeon_CPUID.txtϋ f~}kBJPJJd[3;f]:{.|Gd:ͳR_}]x~t]6U+הWJ[wß_~|QrRNV]r6ͺhjektT6UוCUR[8ܺhJ9mtv9ýݏJM6Ѱ-=n6rږʴp۝p5)7ㅲ(s!4d3\9Vnn3Lnc}WzRf]_ je^zR;~mNZ>'=m2*WF-ˇw'+/銵`b_|ᲫP S] ס:n_գÇW$]"e䥥-oB^S溔|'hw[_Q>}{v'Q޿Įvڝ?6}m?g=\׼~n l̺8`ŭJimYwuUF w^.?)~iv]ۺsQն6gv(lU:eTUU+}kQoօUfgQesZX;(7JinLR_3N5{T{+W{tAja@9Hj@ H @j{v@*i _RH0R@H# ma@9HZ@ H @  uT AR@/) =h* K, a@9H9 ) F^@ HSi{~րT AZi H0R@H0HiH0 6 @ H#Z/ ) T_n0bfvH[@ H @ ԼHWT A È Hi NMA$i աǻ:|i HR) Hz9;5/R:5a@9Htjtjԏh`&-l0NMrf94i) #Z/ )4ة StN&M&@/?@ H Hi vjr8H$i өIө R?R@HZaYtjÀ4sԤHHz) MNMZ  StN&M&@/?@ H Hi uj2J`)0 s:5i:5~R@G^@ HSiSS4H a@7HM -@R@zET R@^NM6A9rf9!ԏh&RԤy fqrt9sHi) #Z/ )4Щ F R9 H3sH ~R@G^@ HSiS6A9rf9!ԏh@v7`)a@9HCj8R?R@HNM8o,R!À4s9p)  ~D4ʝqhYC*i sR@/?@ H Hi ;58H[@*i m瀴_R@zz) Mr8o, À4stH0R@HNM4o, RK&9 H =5 Ha@ HJa@ HˁTdNF StN&K&@/?@ H Hi b&w7`)0 s:5Y:5~R@G^@ HSة=m0NMrf9,i) #Z/ )TԤ6AJ&9 H3NMNM_~@*uj2gF StN&K&@/?@ H Hi :5y fqҩIA:SS  ~D4Jڳy fqҩIA:SS  ~D PKvi._A`|PK&GenuineIntel0050654_SkylakeX_CPUID.txt_ܶ ;Kɽ$EI1]$ ,0΢uaۦ4D\v`psEQWd܊?ܽ[ߋ[;wo$O}ӯ6VV_y{S Ym#2MlcJ[$5&×Qr$d#QF$SWN)]ȤV"&D9$tLz%X02aŒj쎤?Ds;լf%YYiVKRllzDݴ]H'LiӪ]f7\Z9W^91X Ju{&fGr$Mܑ9Vtsδ"QL;@s wgK 7RFu5O |b6fv3dQqsv3llnSYnb2nbRP4\YLy`z ȑ(SdK̓>f;\feCQ;ܴ(bݿOT<-oTl9К<8lY숩JѮ/T!Z~EerDV2UH:1*W_u~#+s+RԤsZ9L4(I_\9_yڵVn&3VhEE5٠ۻDMxb./4|^?E~fV/+!2o㻻ݿ65o=n뻇Mygxp[|%κ͆2<~"+xwᛮ0`f: 0 \15+|5pEl9uW(pfp\q^ظᛮ0) `0 0(Pظ0\ᛮ+)\a W+ p+RE#90f= 0%6.,bjWk { WXpfp\qE+.q0foHOȺ 10 1wƹ#; 0%6.2p M)\+W,4+ /W+\q150|5F~ ` 0  g >;wr Fw`ᛮ,8V1ǀ*`6, `1w%.fo8=7=7 @ %f q%.П;`XkSs3s,`XbX,^8Xנ^t fo8A7A7 @ %f qKl]Cw MtftXt` X,`q>8Ewzѭ A݌ .a0A 0G.u37]Xңѣ` 3`&E.Ф;`ak St3t0Xba0@^8aץ;t t `qJnFnE,K  tݺ@ᛮ0Nih cax(;|hgaD92}X;Gy%ʑl<[<U6zDU}7:y%"7lU:3,Qa{}X*r}Ӳ{~͇ϏOރq"-? [쥮iHR޾ %0$k pԡ!TJ:M,۴"oPM?bBL!+v=lEY˒L$KE;)ƕrU=wy ܌O,ڭNextӕ$, )&yI5dU;XY,gGV/ɒGI/IlՓ/q@엲^J^uS?z+2I'iV+$v$CʓXf_tj6.tnRY#zY4ys4d6JO:T"Kl(٩ʁdũ 6a}ݰ?w 6n͇gsh&ѕNЉQ*u_n=|?wH@kp\rxn&aF8x(dLrF`RBJ$cb֌f%3,fY,]o֭Y椛(MKd(‰ҝ$VttjvpI%k1}1rSa`d=|9e S>a"pެR_L}mCZҽD&CᦍCI`NXvuR%U9υ-OfsTj2*$v$)Lǂ*LY$y9`F'. a$($O>C/U;X')g3E$ԓ?JRpȂ(Kj $|r0Ŕ/f͋'BIl7sIg@GK./PKCkcPK,GenuineIntel0050671_KnightsLanding_CPUID.txtood7 ȓ]{yH?$ȭ[U#0Aәi vͫ$$J:-MvU,P#֏OuOq<1Lq>,o}/~~90Nn? 0~:_t8gnøwF7/gë^>V0lN~pӜ?=a}ovg{,W`O`g ?¹?x?h+_,4%ۆpX _S57ay8g?|zӒJ/H(E^3>mg_/ap^~?bP?WgPA7ܠ5),{Y 0ɵɽrvǷݛ}ow_ư??}^5Zv|/΍FEVO~?/Y5+Aց,ȂlwȊ YWc[AJl ؊ڝsm ڠƐ%FY`BVj,`glVmPc%؊ڝsm]@dA! ,ȂlwȎ&d}솭ت j֭ [[u\[+,` ڠƐ= {YMȆ XGj)ڲՕ$[?[ϵ_:XUK% #YYgk``U-EcD\C\mmb%,,ʪhLْ ֑,vXa +4"Wm*Z-Vtp}oW[#VDj)SЉeQCemKXZZp-iE,"WpW[+^(1eKz Qe;Ti(,h גQXpq5s.a9 j)S,peQCemݜKX‚Zp-9 +WpW[;(1eK gaQeSVlPa 9 j)kE굢/]C99WCW頫Zt-99ڡ>NNjbtUKј%[=[];ոٺgwhLגMM芮jkj 6vEWmJ֮+k:8w ]U-Ec]kWtEuunr5n3j)5FWtPW[&Wd0hLג=Ñ=芮jkj誖1]KrHڡMFGHj)ӵ$w芮mF]RX芮j$5z5誖1]Krב]ѵC]mF]R4kI:+vW4Zt-]GrWtEuj&rWtUKіSI:+vW4Zt-]'rWtEuj&rWtUKј%Dڡ^MRWDj)ӵ$w]];֫Ijj]U-E[%Lڡ^MRWLj)ӵ$w]]5z5frWtUKј%Lڡ^MF]R4kI:+vWѫi!wEWm麔 +kz5rWtUKј%Bڡ^MF]R4kI+vWѫi!wEWZ.芮jkjZ]U-E[%Jڡ^MF]R4kI+vWѫi%wEWZ芮jkjZ]U-Ec++kF[PWӁ]R$w=+vWSѫ@j)ӵ$w=+vWSѫic튮j)u+Yn]];֫)մvEWZvX+vWSѫic0hLג={];֫)մg]R4kɞ=芮jjj:Zt=GrWtEuj 5z5]U-EcGrWtEuj 5z5]U-EcGrWtEuj 5z5]U-EcGrWtEtmb^M'֮誖-]O%kkWtEuj5z5XZt-YX+vWSѫ̞atUKі=g +vWSѫ̞atUKј%{FWtPW[XW 芮ڠt@z]5>6WSѫi]A::+kz5]UԘk++WSѫi8+jT ]]֫)XZtu%kW]ѵC]mb^M+hLגc튮ڟWXWg]R +vWXWg]R4kɞaa0kz55z5 +hLגU]];֫iѫI]U-EcBڡ^M.]']~g;YmP[\N_`0(db&wlMMખ1\Kv7yv7+vgsUװfaV0 1{ybbpUK%{={\;ֻI50 j٥fafcb5l::ખ1\KNxN+l|5faVf0 09=akWZrs\C\m\ 0-fCIaaf;dbS5l ખ1\Kr@ !ƞNfR4lIaaf;d)XÒÂZp-a9,k{:5װ0-fcI_H_bt+a#}U-Ec%%WpWcO01fKG,vȬTc K_bpUK%}#}\u1ta9 j)c=:[,Ϊhْtv"YY['x&Ym9;ij3,l^l63,Ϊhْ|v&YY[+(_L>j)s$gqg{t W5ZƜ-ggY5UA-8-g|v!YY[7(_B>j)s$]gqg{tWmZƜ-gYUA-81gKم|gqCgj%Ym9+,lAVYUKј%J>8ۣ~Pj?|gR4lI>,謭j%Y9[Ϯ8=:k:Z=Y UAgqV-EcΖY UAmgqV-E[n%ٍ,lA6ֳ81gKֳY UAm7Y9[xc1lA6ZƜ-ogqCg*Tu$Ym9{,g8=:k:ZƜ-g8=:k:ZƜ-g8=:k:ZƜ-g8=:k:Ym9{*YϞX,謭TzgR4lzzgqGgmb~PgZ=7>gqGgmb~PgZƜ-o|f1lAŪn'qQg_`8)[t*V5L8ڠƜJpgq?gTj8,jsPgqg;t*V5qgA9{.q8:krgqV-E[κc=8ۣ~Pj?(zgR4lzֱYY[?j?(a1ΪhY)o,7YY[?j?(a1Ϊhْ~cYUKј%,謭XZƜ-g|gqGg/rVg=,̪hY_zY٪'Y1[zY A=0[501fKYO8 0#A=0[5d01fKYO6 0#{A=0[V=,̪hP faf{db+fީ'Y1[ faf{db'fި'fRl,ii 0#A=0[>=01fKvGv,>PVMO$Y1[FY٪wd01fKH6 0#.P.i5|ruxWmP[R`x [jőO81gK>}Yhk\e jױ^^;Ub<gR4l⑽8=:k2vWx5Z j%`Ϊhْ;#gwpg{t«61^O%^C^m\ջY9[r6vl,l:=Pa;q6^RTr6vl,k:8ۣO:K>j)s$]gqg{tIƚή8-gג|v%YY[':K>j)s$]gqgsV[':K>j)s$]gqg{tJΒZƜ-gWYUAgqV-E[J,lA81gK,lA6ֳ8-gzgqGgm|~PYUKј%ٍ,lA6ZƜ-ogqGgm|~PqV-EcΖ7o8ۣ~Pj?#,ΪhcI>{$YY[?(_ԑ|gR4lI>{$YYg:ZƜ-g8=:k:ZƜ-g8=:k:Ym9{*YϞX,謭TzgR4lzzgqGgmB~PgZ=7>gqGgmB~PgZƜ-o|f1l^5;ij'fq]oD'ѵM]ZtN-:>].P9]E`fA1Ju0 0!@=0CU+jUJxxWx׋VXƲ gR4l8{gq5R6\ଫ 芮ڠt %tEWtP׋rVXFYmPcf#,vņO^Uc #+v>OY^+,c9j)s\`8)[tbg*vFWt5\댮芮zSN faVK ,vȬSkbWxWmPc% !N)gR4l?H٢N*vCWt5V놮芮jTF;faVf0 0)N5V'xWmPcJx=+kں;VXƞqgA9{.q8:{}kjqXxUKN+W^[b{,2qXUKј%wu1gqGg/wztFbcU-Ec1qXxy)ke,wY9[rXcqg{tbGgk4xr2^R4k-cWx׋ VXrXUKј%u3gqGg/6xztX=cU-Ec3qXxy)ke,Y9[rX=cqg;t6ZKv=}7'Kɳg%drmgq}) V_,/Dwdpx,./Dsd:J=K2}w|YdI N V_B2Cd:umF%!?'1:"t $1f'ӯk˜N"I2 l~-dM_$|Se뿿̹9üOg0ga.O3dp gaNo> οa s283?0'Idp 3{}d/^a!aKgXHfXz}d7La!ac gXHfX}d/Aa1aKogXLfXg/Aa1&u c28[ϰ8$ s283,>0_z>& `gٗ6>0_>F 93lLפYac& ӥhggؘ.E?>t |e3lJٗ?`}78Kg%;'lG}M_! tudmwϲ%S-f͔̹/̹]/;7S2} zd3||3'pKœ)_7s2|!k֜.<0||3+|!+ߜ@0||3K|!.E\87s21L9]0||$q_kL%? ,t\QaI㒝b:.bb(1\dU1d'QKuefIϚpX˿ݐ<$^}uCt-ܐE>7$r}!Y?_nHnX}!Udnu<0wÍw0wÍw0w.g@0$qyɃa&)3 s7C\^`I"yIa&% "$nH^`IR"yIa&% d'zGMB_a&i0wXEWhi˿/-bia&ݲnY sקs'2]ٟJgIͻgI| sק1t sקn YbY Kޗ~Pbx_BA'2NOdNݜ I𳛧~hw:vK5N'n~_p!͵1|޸$[r0B{Hc}K"%[{$l޸$I<HZ{I{o\IG}Kr#æqI\$y7.$޸$%P{㒔H@}K!_7. %`Hfܒn0bnHf\̸ؐ4%ʯ1 ɌKSӐ̸4%ʯ1-Lטd&M{IS)^EҔ(5$3D!4%ʯw Ɍ)Q~iHf$MDC2#C-]D_}nbHf$I$d2$3D_IR"/\ Ɍ$)6$3DzIR"_ Ɍ$)ކdFҳ2wٹk՗~%=+O%=+$=+c|]yu RpP$HMIѼ:4Ì<>(Ob܇*.鎤R_ i_;%rbIɮF84KWXwIZsJؼln4yuR)iN{%g^}WxswKʼ:i4ƒ2>a,`tkb9tԷJL#t4Du3K,M3_ݏOZ4|krSo?qvOCϧӰÐ>D!>ǧ C[]Yܝׯ9wwNavݫ}'D,is~Zidy8Ga O^iNr>~8޶{dCW_:<}ogyy޾Or!!uӦz6ޝP!}a/ޱ\}}X%ܼ'!=ө|\=Y#w+ dYnй!rINO)4pzxr<7Z~C~/OӸy8B;<^/];枼2yo^V#<^>ronxo[!9o_Έg{ruޖ'3|ay8asO~>ٳ>߰G>yȪe~G곍곍y;`wF;Y΢~G¨Va|GOq,dzIϤgR3Lj}&>V?<|WkC/PKyf*ʱPK(GenuineIntel00506A0_Moorefield_CPUID.txt;0{$K(GRI'U+-V鑳6<..w2<<_@ч)xࣅ Yۗׯ|#@@wi!Ӑ!97.s֠h d㱄)L`+nb[?t@ aV0#wXs K 5W[3J.m(^bSUV{ t$t2m~ZFN7ZNڦE9.[$IEU\Fyr+CnH*SO޻uSz.!LZ*,c:;֋c@&dcP{o~-G]!~PK}YPK&GenuineIntel00506C9_Goldmont_CPUID.txt[]o:}0@_ t(cX}ָqݻ A먍ݵ6~ArDYr,Z`6pc⺁z\;''*/ ^z<D&;=.*}=֓#RS0 a{_r_}Cv/W9\3&hpeY0/| WdXoVӍzo F0ōwn?_va:x0[<|̦U/aM>/}u:>QM@ڣ˻?JuuVwAFDeܝ BV>l;ϋhm>.WU6dGa1۬v0{/owI#L/*3o(zamjv?{Dd (zxf0Z~W[æbndvWKji6̿jfCFs)/(>Әܭe`ILqw-ߓOd,=_Ȕ@5)!*D"Vii4ґ5냤RZǂN5$c&0fo  c{"34S2uc*8A^%s]':+cedrB) Y=VY<IJ@ +X Rx묪"x )܄P ۆD^#Eh-~Za;DnhVEGĘa2B'㮨XXM_>p9亻 U;߰_RŴdlaǘ11Ǧ L|Oh{pk0<'9B@.vPoHӽgUɎ$IœIG!Ñ5Ud lzK&@owtmf_ ƈEeWaseV63J,0:Cѣ$ux.O&k$$^ xRi+NuxoQ':I<'x5OtIgNW':I7(ē$I<';B$޳TZ'񊫓xxἐw@ȷp4o/yw % 5ݻ% Y4?Hܒy,Zp| zi1]a7y$FUGUNS$zd½8DJ/U_,*F.DFZ3 % =3Sd"TvdBʊ/U6$ՑQG Y@X$uΞ@8{Tzb뮽iA A Z4!q/WǡׯEZճPFj0ˊ>PD>B+27]b-kuN6T ].pcAÊ=҂*SGD 4{-$,HԂPK'GenuineIntel00506C9_Goldmont2_CPUID.txt[o~g./EyD]+P-y[jdɥٿRHe P9w܆QHv\IYW%{t} 88Hd{~߅tb6I m&\hi]Fߛ}{H` MNd :a78a "f"ޔxr 焄9d}Qޣ̕t<<,VŰ>F6}ou6zr>)`<LQvbٙH _v^4=/r8^=~4I>Y=.VIyЮ}ܩlKv9: ee0##2p~n`SxprZ]{|0՘}NC0jD7j.u>~Yr-fփ bq>N 'ph4C&0`4j7ylq욬Dpr^ݞspIYdzNoVƬVkgkƏaHh0Ɵ΀ tEy^oxuayqx9M*g+U_$rq[ݣP7]v wW"%#i @Z\./_j6衅 "CtPʉ|__E򕪑$CDT HFC8xd ڌaHzzdFKr@'ddV'[ElPCVU$.l?)Av)"boͪR!yC@$k$?OKlCdf,&p "b bb=r7zY$/!ݥxLn晛ϟ>\#g |kTEnsWpwlwO;,=G2 uYvkoh&+qRwl.aŘ#l!T6\׵ac>в,p ΅G d-kʺ XulO8nN֋fG$%0ipd Af.a!wPH5f/KrR_m]%9;{؜lʹHnJl0πmP{Yj~:ש=S{-jujԩ NeG:שcR{{=ѩNH?oQ{S{-NHuj/;:שNCNujDԞ|ړk!ujES{ѩNϫ=o)M7ٷ8;R}_ɴDfɬDƏs2/e#٠Vp.6$Eŧ"\Ov;O/U!AW¼Fejl?esVp]D!2Ђ(Q٣Y騒㈢C('Dq"=%RZ:*Hx@BzMƪH!]*ۑ6ijJZȐ3J#022ۯjYGF 7@h!#tG5{z!+yGnǭ@X"c+}Z"E$0W J*.C|4}ښ(* M.pl㪾Y4uf"Kd=z) V 섪 A)TMQQU ZhSH!w9RHޙ|ABi RD~4+Yi]T#llT8Gc՞H"̮Yi;*F4$R[hJojs"F(H5/C\lQ"[@(93>Y|tτCª}$Rz#au֕(V㸼 !sYgǫA*C,"ZoBQȟTQ*zoF#+5$|"M^7 _=nr\bQULq6-T&t]#2aM#´IAkZ#2jPMHV%H8-? f8b|H8"#qH5k-V))MoR*ӈm)XXXXXXV~o}'*MP!!Xa<'ۻ DMOSnnd63ܝjK!7Gq4/xK˼sئ;pӟ. y?7[.;`u<ٴ4#n$R3mb'[,D^m}MK.YnI "48-+l%54h#K|?PKQU "BPK#GenuineIntel00506D1_SoFIA_CPUID.txt=@{$ÕP4iWv"RY)P*hx&)<:ݳsӞ/`ճj(p E mх#*?noV5x:&KGACS$ P Vhnj KwjmiSEM;,Aü쬂mְh^l[g.(*H$)3'U@ Jۛ jւGÎB=M [>m@ \\o/)ưEWŧKR}ll* N9xl lv{?ϫè3eT_/`{//x\db70[gp->ebw<{<PWJkv"H}$b\B}sg7&˜`,1FRBJ#}т |` R a3}т u1fH8$^a:^4a0,&!L0QGX0k^(^"qJh;Qʫ7C5$e(ޒ 4s]ߎ]5\j9 qεnR-lGY w6xD0oéKIPOngீ# zp]nw>p5Lyp8)bJYNpC>f#9nuH UÿgՕe>ށRȧBqF1ǩܷ}ϭ~6e"aƙ }xa1Şaov?|ҔQr}fOnWm$ѷ #t2L? hd l?D~˾@ml5/{yITS'ꇋHSO4Y0&@I ڄMAAG=:hMOrp|t]xt&=8h-zt=OGG=:A;8hvf£6AoqbtУG}"<:h<:A4 k"hw\Ϻkq.aҀ,H ̭kf XX'*#w.PnRnd9*_%O)UicDI-(1$T If޹l+[؊(V.0+}T 'ܜQ2Fik05R5֨) mY]u?,& ¢5rp!鮈<5$SJ !HnH+I$9gH|Iz<$ %6{ڔ3Ҧ .!{IҞ^Z5)IbY ~AҾj9qWVF =z1sT4$â eX6ebH,íCcZBNm\=61$51Q|л >3ygGS nOLIA~~vo?lOzm|OPWjs}$IɋaIc*W:'uO\Թ>s}RICR+\Թ>s}R3\Tק7$L'U盤Y|I]IyLlV$u}tX%u}NcVyZn4I]Q<>(Mҹ>s}2dɊ ]PK+ QPK&GenuineIntel00806E9_Kabylake_CPUID.txtoܸ  З; j(jr/F6"Ev8|pH~%?>tXˊݬa~`c#y}xwfjnnkoqezxH )8&p}7ODbFx|p"4X2HDrH$Z v#Ð5HvӬ'R 4§bʋC-8Pb݉E*VD]Z %!ҝ7;vb*f$T8mJ?$u,+F)H$ꉊ9# :t7U19=g^[pbؕ݉(L^5y,H,s27d%)4'ӑOFƣĉM{x9f`f. &Y7 Ĉ5Sy\Ci];h}k#RԣeTrъu.B EdㆴZIZR|ֳ|ӛI?bń\ ap ~϶xz5)Fd+k?^T\HgE.9)2#H_fxcy**zŘYʧwߛWLK_7zWOϏR{v&;U1TҜ"T/~~>>YS=/:} _bq1Ջ/HbbSM5ekKŋE߂xiZ'ċ>Rx鶱xK/^l/-N_XLXX-jS-S b/m,z1Ջ>T~P37Wm\@s5zA/%X̉Oy|>=oD/b¶PCnoW53"F8ԡ&PCdw2!bCu E=rB`DA5fߝ.(En&iHpJ;OڢΛ*Bܪ}vؘe͕bNp*03X$&]/8KD8TE2lDtc$ #nX+&ng/!F EPPGHęDJB)݊꺩ٟoG~ r!ٌU4;bB:0Ov"YPnj˛x-' h*C*k/bRzkƤQQ ҶkR|ēUÚ<:Bhż7+ k#+QG#&Htp;lL訄 1C-|DUU&mr4 $&j"]#yϖr`Fp2Q=FMFuF>F J[!6OݧwyBBGdC"B+bl"d|YXk\)dVKNtC{-pQ5`lĹ$p i̜ 9 "2KU}!ߺ&{Ho*(rQgHIz$Nc3 e.8ud7b|x *sȐJˌYɑ:,봊#4-&p*b2B"Z6[f.S6LhleRp b>y3#qpX.<!U.B2&"B\PKu섿<PK&GenuineIntel00906E9_Kabylake_CPUID.txt]mo8 a3|)u7h5nw`?hձ{?P(Qr(TV|pH>R +X,l Uw.ϋnCϒP 83U~x|>yB _|٧y}}ok}EgU19QD)ķ' <ئ%fÃc8xtfղ08qx0(w~b5@!.R[ nںÕŔ\3/d?bQ7!fS}Yw'wźjT GuR~SDXe/qvX\6&U{<_>h>_`t?]MN'b9Ax'6 iQ_ϓ|Z߰./PϨ^{1] >z%pݢ(OXzJȔ@{\k +MH}D,̢(#QFYe %GJ3,#buACA ЩFQ|3 W،mGfdI\GTIfv2yLYVd${DMZ ԾP(k&JV$2oeFЕ]U2)2SHPq"I R6Ak쎊ّ#UuUL^g^l&[^wdܔf]ݐP&,vxҬmr[daKTEMr,g{:r3An(rkdAb{:} S*ڋ}>w5`AgepwIow/p [6EY1]G PRj51M#ukhwy賖FbCԅ <|d&8C"O0_zpMC\qm#w fӤٱ'+e6QtT;46}Ʀk}'}>mvĶIz b>GlS' ;'ىm'6Nlf{m#^h3dMk994vi=Nc;4p46/m&5m͝vbd'vbh8bb[%ُx-n6IAchl4d$;4Fic5x9&;m^#=' ;'ىm'6Nlؖ{m#^hKdMk9[:4vi=Nc;4p4z/m&5mvbd'vbh8NKl~=!8oJ+%_]iL^Ya5+j'ȼ邨YV+^#w kVՊG YȪl}vT=/>Obak .pu1Wg } kXA4E^;ꐍqwVۍZĕ 'EJX+Sh89Jcď.~)14I LB":cJ|!d?2bH<߬<l0a~/2wH4G0 9QBaCȲ, Y%)ÙgeRZD&Yf@[J P i 4Jj13hU[U*~ck0հbۚXj@92Yf-go9ӏjRq"0#J(mٜ6GQmoJ,d]}z6pɥd9$"7 }at!@,wc+ t.Ge@\ PH׺ 4wrt\CjIa\C>bۼ 3flmH?Cb ϺN:IӮf9|fli7B!$#ߒ 2JD2e@J+0 QWr7fr(*dVVdCQbU͉9T[*U)ӄ1һ+kE)QJuJ?JuJ7'Z?(&ԀX&:2NI[&:Im9X|/u-oEy|%ίh0*Vx~˷LJ- Y%I=pD}oPzqEp)O?jݡpG7Ěu=Q_؞|{ kO iiƗ OKeefÊVPg " ~Vc%5ij2$螘Ãw}߳m lQ8_&NdM^2Ze#OV0'h`x,_S(fu`U>!jcyx8c(vԗ)vDXgߌ267|K_tÃPK-eS gxPK'GenuineIntel00906E9_KabylakeX_CPUID.txtk6}iNNV( =P6:뇓؉e6q7KEN:Orj_ Q_U=<.UKu+gkW9٭4-W?o7asV0!,BY]UX(JnV*1E:TlhG@M.:$UW0fftPaLTG6L1lJqSvZ ^܎B| ?>+2q*f'i~(xKCe6eaN]3i 6[oȩ}wlڽsR[cxuR4*Yfs`3 (FSt9RN4~֥`㍺W{@Umɛ?slS4lJ\?aX٘Bn51se̜U+~ÝssSf*y#`ɓǥf@ւZߩ7gYU/x._pƞy;"%)Sv}; eϴG=l92K/:g!%>!m:˳E\>Zqgb@Цa>zB NMUK@8І߿mF)vl-y͛KLSfP>&e"K+ٰO\iNDL/(3b?[OPa{FICHQW/PKʍPK!RiseRiseRise0000521_mP6_CPUID.txtdRQ˛@| }ii5=41 ҇I3Ӑח\baݙ\褆oӋNb ~W. q J~Jb ƫnnݛrUWUEܷmϑ~ioj/Eg<cs?uvMC?A?lۼB-]hV#5V%\+{$ΝN_XeLG$yrG2P؀S6jHdH]E$ԊkA! nLLŠL-IdrJ;Id0"aHSjh.#Sj ܠA4nOL+ FRТVI^גt?r $$%h#o*C7Ahs{,D<wmW0d(9ZHPR hPH*dq ~G$1"9*q4"]ɴSVtj eX>>jWW ?4"Nb:Ah nuDx*xR_3 bSL+*i:mކПdk -ADPc I\Htw?|}p}eM;[+3 XvPM'PKq;PK&GenuineTMx860000F24_Efficeon_CPUID.txtoFߑF˝f.[E  $TKB vjk}6aw?Ύ0~,-zd<y'f^h𞓰d+KwXzUTD|$=nMy] ~IfgXEQ? 6-Igm |zNJ>fM ەL1dTBĠ$3"0IfL+c_2e5 2qW8_-r"*/FTt2WE'H1%<n: hVWb Թset+=T&Hdr2J.UO; 8M|G#H=@DE$w )tnOtpD6BmNj.F<]Q'zUֹp ӷ񌜲¯; 䂄7ΛnJ|U;Hkld:H8F0"5as.$ݸ8w]_@j3J{b!;< n_x_PKUD5 PK(Vortex86_SoC0000522_Vortex86DX_CPUID.txtrtQ0+PL@̔ E!T.4! PK!%?hPK(Vortex86_SoC0000586_Vortex86MX_CPUID.txtrtQ0+PL@̔ E!T.4! PK!y?hPKgpY dP AuthenticAMD0000500_K5_CPUID.txtPKdR AuthenticAMD0000501_K5_CPUID.txtPK dAuthenticAMD0000511_K5_CPUID.txtPKg< ~AuthenticAMD0000514_K5_CPUID.txtPK6  AuthenticAMD0000524_K5_CPUID.txtPK]w - AuthenticAMD0000562_K6_CPUID.txtPK 3 B AuthenticAMD0000570_K6_CPUID.txtPK2P}E(AuthenticAMD0000580_K6_Chomper_CPUID.txtPKmH 2v+ AuthenticAMD000058C_K6_ChomperExt_CPUID.txtPK y):+AuthenticAMD0000591_K6_Sharptooth_CPUID.txtPKat%*AuthenticAMD00005A2_GeodeLX_CPUID.txtPKȉM{ %;AuthenticAMD00005D0_K63Plus_CPUID.txtPK`! %AuthenticAMD00005D4_K62Plus_CPUID.txtPKreR&!AuthenticAMD0000612_K7_Argon_CPUID.txtPK7 1&AuthenticAMD0000622_K7_Pluto_CPUID.txtPK4؊-)AuthenticAMD0000630_K7_Spitfire_CPUID.txtPKO4,"AuthenticAMD0000644_K7_Thunderbird_CPUID.txtPK(L)$AuthenticAMD0000662_K7_Palomino_CPUID.txtPK6YG'O'AuthenticAMD0000670_K7_Morgan_CPUID.txtPKM -[(AuthenticAMD0000680_K7_Thoroughbred_CPUID.txtPKnPE*+AuthenticAMD0000681_K7_Applebred_CPUID.txtPK"OF'-AuthenticAMD00006A0_K7_Barton_CPUID.txtPKnh +.AuthenticAMD0000F4A_K8_Clawhammer_CPUID.txtPK=W-1AuthenticAMD0000F51_K8_Sledgehammer_CPUID.txtPKQh^-35AuthenticAMD0000F5A_K8_Sledgehammer_CPUID.txtPKTA+^8AuthenticAMD0010FC0_K8_Winchester_CPUID.txtPKӚR(9AuthenticAMD0010FF0_K8_Palermo_CPUID.txtPK["+:AuthenticAMD0020FB1_K8_Manchester_CPUID.txtPKO(h>AuthenticAMD0020FC2_K8_Palermo_CPUID.txtPK- 'AAuthenticAMD0020FF0_K8_Venice_CPUID.txtPKR!%,(DAuthenticAMD0040F33_K8_Windsor_CPUID.txtPKu.(DHAuthenticAMD0050FF3_K8_Orleans_CPUID.txtPK~!)IAuthenticAMD0060FB1_K8_Brisbane_CPUID.txtPK)R%MAuthenticAMD0070FF1_K8_Lima_CPUID.txtPK+wl;+WNAuthenticAMD0100F21_K10_Barcelona_CPUID.txtPKEn#!'`RAuthenticAMD0100F22_K10_Agena_CPUID.txtPK9f\ &{VAuthenticAMD0100F23_K10_Kuma_CPUID.txtPKE =++XAuthenticAMD0100F2A_K10_Barcelona_CPUID.txtPK ]Ky?*]AuthenticAMD0100F42_K10_Shanghai_CPUID.txtPKVb*aAuthenticAMD0100F42_K10_Callisto_CPUID.txtPKx7&cAuthenticAMD0100F42_K10_Heka_CPUID.txtPK@\y!_"'eAuthenticAMD0100F42_K10_Deneb_CPUID.txtPKuv.+jAuthenticAMD0100F42_K10_DenebTWKR_CPUID.txtPKPH'kAuthenticAMD0100F62_K10_Regor_CPUID.txtPK\b  ('pAuthenticAMD0100F62_K10_Sargas_CPUID.txtPK{\*TtAuthenticAMD0100F80_K10_Istanbul_CPUID.txtPKU~XYS(yAuthenticAMD0100F81_K10_Lisbon_CPUID.txtPKodB,I|AuthenticAMD0100F91_K10_MagnyCours_CPUID.txtPK(]4(iAuthenticAMD0100FA0_K10_Thuban_CPUID.txtPKfU)AuthenticAMD0200F30_K11_Griffin_CPUID.txtPKxx&'AuthenticAMD0300F10_K12_Llano_CPUID.txtPK|O~([AuthenticAMD0500F01_K14_Bobcat_CPUID.txtPK镖`L)AuthenticAMD0500F10_K14_Bobcat2_CPUID.txtPK-bL)AuthenticAMD0500F10_K14_Bobcat3_CPUID.txtPK1}J(pAuthenticAMD0500F20_K14_Bobcat_CPUID.txtPKe(CAuthenticAMD0500F10_K14_Bobcat_CPUID.txtPK|]'+~AuthenticAMD0600F01_K15_Bulldozer_CPUID.txtPK%*/M+SAuthenticAMD0600F12_K15_Zambezi6C_CPUID.txtPK8v K+֠AuthenticAMD0600F12_K15_Zambezi8C_CPUID.txtPKbF<y(AuthenticAMD0600F12_Interlagos_CPUID.txtPKQxBg)AuthenticAMD0600F20_K15_Vishera_CPUID.txtPK+{l',AuthenticAMD0610F01_K15_Piledriver_CPUID.txtPK4P P*AuthenticAMD0610F31_K15_Richland_CPUID.txtPK57(AuthenticAMD0630F01_K15_Kaveri_CPUID.txtPKrV7*:AuthenticAMD0630F81_K15_Godavari_CPUID.txtPKU?ΛE+>CentaurHauls0000693_C5XL_Nehemiah_CPUID.txtPKչM+?CentaurHauls0000694_C5XL_Nehemiah_CPUID.txtPK3̑<+?CentaurHauls0000695_C5XL_Nehemiah_CPUID.txtPKs:*@CentaurHauls0000698_C5P_Nehemiah_CPUID.txtPK+|(!CCentaurHauls00006A9_C5J_Esther_CPUID.txtPKlNp(ECentaurHauls00006D0_C5J_Esther_CPUID.txtPK_^ (HCentaurHauls00006F1_CNA_Isaiah_CPUID.txtPKz(ICentaurHauls00006F2_CNA_Isaiah_CPUID.txtPK*j (gKCentaurHauls00006F8_CNB_Isaiah_CPUID.txtPKBZ (NCentaurHauls00006FA_CNC_Isaiah_CPUID.txtPKb:4L (oPCentaurHauls00006FC_CNQ_Isaiah_CPUID.txtPK@OV+(TCentaurHauls00006FE_CNR_Isaiah_CPUID.txtPKL &ZCyrixInstead0000540_MediaGXm_CPUID.txtPK:'Ktc!<\CyrixInstead0000600_MII_CPUID.txtPKfue!]CyrixInstead0000601_MII_CPUID.txtPKG~'_Geode by NSC0000540_Geode_GX1_CPUID.txtPKp M'`Geode by NSC0000551_Geode_GX2_CPUID.txtPK'aGeode by NSC0000552_Geode_GX2_CPUID.txtPK,k/)GenuineIntel00306A9_IvyBridgeWS_CPUID.txtPKU M[%wGenuineIntel00306C3_Haswell_CPUID.txtPKۀJ)GenuineIntel00306C3_HaswellXeon_CPUID.txtPK:/^;'GenuineIntel00306D4_Broadwell_CPUID.txtPK hC(VGenuineIntel00306D4_Broadwell2_CPUID.txtPKn8)jGenuineIntel00306E3_IvyBridgeEP_CPUID.txtPK}9)KGenuineIntel00306E4_IvyBridgeEP_CPUID.txtPK}9)GenuineIntel00306E4_IvyBridgeEP_CPUID.txtPK@} y'kGenuineIntel00306F2_HaswellE2_CPUID.txtPKYѴҗnj'=GenuineIntel00306F2_HaswellEP_CPUID.txtPKdNhr() GenuineIntel00306F2_HaswellEP2_CPUID.txtPKP8II5(sGenuineIntel0040651_HaswellULT_CPUID.txtPK\յv _)gGenuineIntel0040661_CrystalWell_CPUID.txtPK2& (4%GenuineIntel0040671_BroadwellH_CPUID.txtPKJ,))1GenuineIntel00406C3_CherryTrail_CPUID.txtPKl =&Y7GenuineIntel00406C3_Braswell_CPUID.txtPKn13mZ+&@GenuineIntel00406D8_Rangeley_CPUID.txtPKu{s<%eCGenuineIntel00406E3_Skylake_CPUID.txtPKn0 (3JGenuineIntel00406F1_BroadwellE_CPUID.txtPKvi._A`|)BWGenuineIntel0050654_SkylakeXeon_CPUID.txtPK'pI &_GenuineIntel0050654_SkylakeX_CPUID.txtPKCkc)wjGenuineIntel0050662_BroadwellDE_CPUID.txtPKyf*ʱ,9sGenuineIntel0050671_KnightsLanding_CPUID.txtPK}Y(PGenuineIntel00506A0_Moorefield_CPUID.txtPKQ=_|>&#GenuineIntel00506C9_Goldmont_CPUID.txtPKQU "B'֨GenuineIntel00506C9_Goldmont2_CPUID.txtPKxphR#@GenuineIntel00506D1_SoFIA_CPUID.txtPK+ Q%GenuineIntel00506E3_Skylake_CPUID.txtPKu섿<&wGenuineIntel00806E9_Kabylake_CPUID.txtPK-eS gx&GenuineIntel00906E9_Kabylake_CPUID.txtPK]iL'GenuineIntel00906E9_KabylakeX_CPUID.txtPK llCk!Genuine__RDC0000586_RDC_CPUID.txtPKʍ!HRiseRiseRise0000504_mP6_CPUID.txtPK @"\r!$RiseRiseRise0000521_mP6_CPUID.txtPKRW#RiseRiseRise0000580_mP6II_CPUID.txtPKČ3i$rSiS_SiS_SiS_0000505_SiS550_CPUID.txtPKq;$GenuineTMx860000543_Crusoe_CPUID.txtPKUD5 &OGenuineTMx860000F24_Efficeon_CPUID.txtPK!%?h(Vortex86_SoC0000522_Vortex86DX_CPUID.txtPK!y?h(VVortex86_SoC0000586_Vortex86MX_CPUID.txtPKGUcpuid-1.1/testdata/getall.go000066400000000000000000000024621313655072600161030ustar00rootroot00000000000000package main import ( "archive/zip" _ "bytes" "fmt" "golang.org/x/net/html" "io" "net/http" "os" "strings" ) // Download all CPUID dumps from http://users.atw.hu/instlatx64/ func main() { resp, err := http.Get("http://users.atw.hu/instlatx64/?") if err != nil { panic(err) } node, err := html.Parse(resp.Body) if err != nil { panic(err) } file, err := os.Create("cpuid_data.zip") if err != nil { panic(err) } defer file.Close() gw := zip.NewWriter(file) var f func(*html.Node) f = func(n *html.Node) { if n.Type == html.ElementNode && n.Data == "a" { for _, a := range n.Attr { if a.Key == "href" { err := ParseURL(a.Val, gw) if err != nil { panic(err) } break } } } for c := n.FirstChild; c != nil; c = c.NextSibling { f(c) } } f(node) err = gw.Close() if err != nil { panic(err) } } func ParseURL(s string, gw *zip.Writer) error { if strings.Contains(s, "CPUID.txt") { fmt.Println("Adding", "http://users.atw.hu/instlatx64/"+s) resp, err := http.Get("http://users.atw.hu/instlatx64/" + s) if err != nil { fmt.Println("Error getting ", s, ":", err) } defer resp.Body.Close() w, err := gw.Create(s) if err != nil { return err } _, err = io.Copy(w, resp.Body) if err != nil { return err } } return nil }