[
  {
    "path": ".codecov.yml",
    "content": "ignore:\n  - \"**/WordList.swift\"\n"
  },
  {
    "path": ".gitignore",
    "content": "# Xcode\n#\n# gitignore contributors: remember to update Global/Xcode.gitignore, Objective-C.gitignore & Swift.gitignore\n\n## Build generated\nbuild/\nDerivedData/\n\n## Various settings\n*.pbxuser\n!default.pbxuser\n*.mode1v3\n!default.mode1v3\n*.mode2v3\n!default.mode2v3\n*.perspectivev3\n!default.perspectivev3\nxcuserdata/\n\n## Other\n*.moved-aside\n*.xccheckout\n*.xcscmblueprint\n\n## Obj-C/Swift specific\n*.hmap\n*.ipa\n*.dSYM.zip\n*.dSYM\n\n## Playgrounds\ntimeline.xctimeline\nplayground.xcworkspace\n\n# Swift Package Manager\n#\n# Add this line if you want to avoid checking in source code from Swift Package Manager dependencies.\n# Packages/\n# Package.pins\n.build/\n\n# CocoaPods\n#\n# We recommend against adding the Pods directory to your .gitignore. However\n# you should judge for yourself, the pros and cons are mentioned at:\n# https://guides.cocoapods.org/using/using-cocoapods.html#should-i-check-the-pods-directory-into-source-control\n#\nPods/\nPodfile.lock\n*.xcworkspace\n\n# Carthage\n#\n# Add this line if you want to avoid checking in source code from Carthage dependencies.\n# Carthage/Checkouts\n\nCarthage/Build\n\n# fastlane\n#\n# It is recommended to not store the screenshots in the git repo. Instead, use fastlane to re-generate the\n# screenshots whenever they are needed.\n# For more information about the recommended setup visit:\n# https://docs.fastlane.tools/best-practices/source-control/#source-control\n\nfastlane/report.xml\nfastlane/Preview.html\nfastlane/screenshots\nfastlane/test_output\n"
  },
  {
    "path": ".swiftlint.yml",
    "content": "disabled_rules:\n - trailing_whitespace\nexcluded: \n  - Carthage\n  - Pods"
  },
  {
    "path": ".travis.yml",
    "content": "language: \n  - objective-c\nosx_image: \n  - xcode10.2.1\nbefore_install:\n   - gem update cocoapods --pre\n   - pod update\ninstall:\n- gem install xcpretty-travis-formatter\nscript:\n  - xcodebuild test -workspace 'HDWalletKit.xcworkspace' -scheme 'HDWalletKit_Tests' -destination 'platform=iOS Simulator,name=iPhone 7,OS=12.1' | xcpretty -f `xcpretty-travis-formatter`\nafter_success:\n - bash <(curl -s https://copilot.blackducksoftware.com/ci/travis/scripts/upload)\n - ruby scripts/coverage.rb \"$SCHEME\"\n - bash <(curl -s https://codecov.io/bash) -f 'coverage.txt' -y '.codecov.yml'"
  },
  {
    "path": "Cartfile",
    "content": "github \"Boilertalk/secp256k1.swift\"\ngithub \"krzyzanowskim/CryptoSwift\"\n"
  },
  {
    "path": "HDWalletKit/Core/BigInt/BigInt+Extension.swift",
    "content": "//\n//  BigInt+Extension.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/01/24.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\n\nimport Foundation\n\nextension BInt {\n    internal init?(str: String, radix: Int) {\n        self.init(0)\n        let bint16 = BInt(16)\n        \n        var exp = BInt(1)\n        \n        str.reversed().forEach {\n            guard let int = Int(String($0), radix: radix) else {\n                return\n            }\n            let value = BInt(int)\n            self += (value * exp)\n            exp *= bint16\n        }\n    }\n}\n\nextension BInt: Codable {\n    private enum CodingKeys: String, CodingKey {\n        case bigInt\n    }\n    \n    public init(from decoder: Decoder) throws {\n        let container = try decoder.container(keyedBy: CodingKeys.self)\n        let string = try container.decode(String.self, forKey: .bigInt)\n        self = Wei(number: string, withBase: 10)!\n    }\n    \n    public func encode(to encoder: Encoder) throws {\n        var container = encoder.container(keyedBy: CodingKeys.self)\n        try container.encode(asString(withBase: 10), forKey: .bigInt)\n    }\n}\n\n\nextension BInt {\n    var data: Data {\n        let count = limbs.count\n        var data = Data(count: count * 8)\n        data.withUnsafeMutableBytes { (pointer) -> Void in\n            guard var p = pointer.bindMemory(to: UInt8.self).baseAddress else { return }\n            for i in (0..<count).reversed() {\n                for j in (0..<8).reversed() {\n                    p.pointee = UInt8((limbs[i] >> UInt64(j * 8)) & 0xff)\n                    p += 1\n                }\n            }\n        }\n        \n        return data\n    }\n    \n    init?(hex: String) {\n        self.init(number: hex.lowercased(), withBase: 16)\n    }\n    \n    init(data: Data) {\n        let n = data.count\n        guard n > 0 else {\n            self.init(0)\n            return\n        }\n        \n        let m = (n + 7) / 8\n        var limbs = Limbs(repeating: 0, count: m)\n        data.withUnsafeBytes { (ptr) -> Void in\n            guard var p = ptr.baseAddress?.assumingMemoryBound(to: UInt8.self) else { return }\n            let r = n % 8\n            let k = r == 0 ? 8 : r\n            for j in (0..<k).reversed() {\n                limbs[m - 1] += UInt64(p.pointee) << UInt64(j * 8)\n                p += 1\n            }\n            guard m > 1 else { return }\n            for i in (0..<(m - 1)).reversed() {\n                for j in (0..<8).reversed() {\n                    limbs[i] += UInt64(p.pointee) << UInt64(j * 8)\n                    p += 1\n                }\n            }\n        }\n        \n        self.init(limbs: limbs)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BigInt/BigNumber.swift",
    "content": "//\n//  BigNumber.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/6/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct BigNumber {\n    public var int32: Int32\n    public var data: Data\n    \n    public static let zero: BigNumber = BigNumber()\n    public static let one: BigNumber = BigNumber(1)\n    public static let negativeOne: BigNumber = BigNumber(1)\n    \n    public init() {\n        self.init(0)\n    }\n    \n    public init(_ int32: Int32) {\n        self.int32 = int32\n        self.data = int32.toBigNum()\n    }\n    \n    public init(int32: Int32) {\n        self.int32 = int32\n        self.data = int32.toBigNum()\n    }\n    \n    public init(_ data: Data) {\n        self.data = data\n        self.int32 = data.toInt32()\n    }\n}\n\nextension BigNumber: Comparable {\n    public static func == (lhs: BigNumber, rhs: BigNumber) -> Bool {\n        return lhs.int32 == rhs.int32\n    }\n    \n    public static func < (lhs: BigNumber, rhs: BigNumber) -> Bool {\n        return lhs.int32 < rhs.int32\n    }\n}\n\nprivate extension Int32 {\n    func toBigNum() -> Data {\n        let isNegative: Bool = self < 0\n        var value: UInt32 = isNegative ? UInt32(-self) : UInt32(self)\n        \n        var data = Data(bytes: &value, count: MemoryLayout.size(ofValue: value))\n        while data.last == 0 {\n            data.removeLast()\n        }\n        \n        var bytes: [UInt8] = []\n        for d in data.reversed() {\n            if bytes.isEmpty && d >= 0x80 {\n                bytes.append(0)\n            }\n            bytes.append(d)\n        }\n        \n        if isNegative {\n            let first = bytes.removeFirst()\n            bytes.insert(first + 0x80, at: 0)\n        }\n        \n        let bignum = Data(bytes.reversed())\n        return bignum\n        \n    }\n}\n\nprivate extension Data {\n    func toInt32() -> Int32 {\n        guard !self.isEmpty else {\n            return 0\n        }\n        var data = self\n        var bytes: [UInt8] = []\n        var last = data.removeLast()\n        let isNegative: Bool = last >= 0x80\n        \n        while !data.isEmpty {\n            bytes.append(data.removeFirst())\n        }\n        \n        if isNegative {\n            last -= 0x80\n        }\n        bytes.append(last)\n        \n        let value: Int32 = Data(bytes).to(type: Int32.self)\n        return isNegative ? -value: value\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BigInt/SMP.swift",
    "content": "//\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||||||||||                       SMP Core.swift                       ||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    Created by Marcel Kröker on 30.09.16.\n//    Copyright (c) 2016 Blubyte. All rights reserved.\n//\n//\n//\n//    ——————————————————————————————————————————— v1.0 ———————————————————————————————————————————\n//    - Initial Release.\n//\n//    ——————————————————————————————————————————— v1.1 ———————————————————————————————————————————\n//    - Improved String conversion, now about 45x faster, uses base 10^9 instead\n//    of base 10.\n//    - bytes renamed to limbs.\n//    - Uses typealias for limbs and digits.\n//\n//    ——————————————————————————————————————————— v1.2 ———————————————————————————————————————————\n//    - Improved String conversion, now about 10x faster, switched from base 10^9\n//    to 10^18 (biggest possible decimal base).\n//    - Implemented karatsuba multiplication algorithm, about 5x faster than the\n//    previous algorithm.\n//    - Addition is 1.3x faster.\n//    - Addtiton and subtraction omit trailing zeros, algorithms need less\n//    operations now.\n//    - Implemented exponentiation by squaring.\n//    - New storage (BStorage) for often used results.\n//    - Uses uint_fast64_t instead of UInt64 for Limbs and Digits.\n//\n//    ——————————————————————————————————————————— v1.3 ———————————————————————————————————————————\n//    - Huge Perfomance increase by skipping padding zeros and new multiplication\n//    algotithms.\n//    - Printing is now about 10x faster, now on par with GMP.\n//    - Some operations now use multiple cores.\n//\n//    ——————————————————————————————————————————— v1.4 ———————————————————————————————————————————\n//    - Reduced copying by using more pointers.\n//    - Multiplication is about 50% faster.\n//    - String to BInt conversion is 2x faster.\n//    - BInt to String also performs 50% better.\n//\n//    ——————————————————————————————————————————— v1.5 ———————————————————————————————————————————\n//    - Updated for full Swift 3 compatibility.\n//    - Various optimizations:\n//        - Multiplication is about 2x faster.\n//        - BInt to String conversion is more than 3x faster.\n//        - String to BInt conversion is more than 2x faster.\n//\n//    ——————————————————————————————————————————— v1.6 ———————————————————————————————————————————\n//    - Code refactored into modules.\n//    - Renamed the project to SMP (Swift Multiple Precision).\n//    - Added arbitrary base conversion.\n//\n//    ——————————————————————————————————————————— v2.0 ———————————————————————————————————————————\n//    - Updated for full Swift 4 compatibility.\n//    - Big refactor, countless optimizations for even better performance.\n//    - BInt conforms to SignedNumeric and BinaryInteger, this makes it very easy to write\n//      generic code.\n//    - BDouble also conforms to SignedNumeric and has new functionalities.\n//\n//\n//\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||||||||||                         Evolution                          ||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//\n//\n//\n//    Planned features of BInt v3.0:\n//    - Implement some basic cryptography functions.\n//    - General code cleanup, better documentation.\n//    - More extensive tests.\n//    - Please contact me if you have any suggestions for new features!\n//\n//\n//\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||||||||||              Basic Project syntax conventions              ||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//\n//    Indentation: Tabs\n//\n//    Align: Spaces\n//\n//    Style: allman\n//    func foo(...)\n//    {\n//        ...\n//    }\n//\n//    Single line if-statement:\n//    if condition { code }\n//\n//    Maximum line length: 96 characters\n//\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n// MARK: - Imports\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||        Imports        |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n\nimport Foundation\n\n// MARK: - Typealiases\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||        Typealiases        |||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    Limbs are basically single Digits in base 2^64. Each slot in an Limbs array stores one\n//    Digit of the number. The least significant digit is stored at index 0, the most significant\n//    digit is stored at the last index.\n\npublic typealias Limbs  = [UInt64]\npublic typealias Limb = UInt64\n\n//    A digit is a number in base 10^18. This is the biggest possible base that\n//    fits into an unsigned 64 bit number while maintaining the propery that the square root of\n//    the base is a whole number and a power of ten . Digits are required for printing BInt\n//    numbers. Limbs are converted into Digits first, and then printed.\n\npublic typealias Digits = [UInt64]\npublic typealias Digit = UInt64\n\n// MARK: - Imports\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||        Operators        |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n\nprecedencegroup ExponentiationPrecedence {\n    associativity: left\n    higherThan: MultiplicationPrecedence\n    lowerThan: BitwiseShiftPrecedence\n}\n\n// Exponentiation operator\ninfix operator ** : ExponentiationPrecedence\n\n// MARK: - BInt\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||        BInt        ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n///    BInt is an arbitrary precision integer value type. It stores a number in base 2^64 notation\n///    as an array. Each element of the array is called a limb, which is of type UInt64, the whole\n///    array is called limbs and has the type [UInt64]. A boolean sign variable determines if the\n///    number is positive or negative. If sign == true, then the number is smaller than 0,\n///    otherwise it is greater or equal to 0. It stores the 64 bit digits in little endian, that\n///    is, the least significant digit is stored in the array index 0:\n///\n///        limbs == [] := undefined, should throw an error\n///        limbs == [0], sign == false := 0, defined as positive\n///        limbs == [0], sign == true := undefined, should throw an error\n///        limbs == [n] := n if sign == false, otherwise -n, given 0 <= n < 2^64\n///\n///        limbs == [l0, l1, l2, ..., ln] :=\n///        (l0 * 2^(0*64)) +\n///        (11 * 2^(1*64)) +\n///        (12 * 2^(2*64)) +\n///        ... +\n///        (ln * 2^(n*64))\npublic struct BInt: SignedNumeric, // Implies Numeric, Equatable, ExpressibleByIntegerLiteral\n    BinaryInteger, // Implies Hashable, CustomStringConvertible, Strideable, Comparable\nExpressibleByFloatLiteral {\n    //\n    //\n    // MARK: - Internal data\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Internal data        |||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    internal var sign = false\n    internal var limbs = Limbs()\n    \n    // Required by protocol Numeric\n    public typealias Magnitude = UInt64\n    \n    // Required by protocol Numeric\n    public var magnitude: UInt64 {\n        return self.limbs[0]\n    }\n    \n    public typealias Words = [UInt]\n    \n    /// A collection containing the words of this value’s binary representation, in order from\n    ///    the least significant to most significant.\n    public var words: BInt.Words {\n        return self.limbs.map { UInt($0) }\n    }\n    \n    /// Returns the size of the BInt in bits.\n    public var size: Int {\n        return 1 + (self.limbs.count * MemoryLayout<Limb>.size * 8)\n    }\n    \n    //\n    //\n    // MARK: - Initializers\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Initializers        ||||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    ///    Root initializer for all other initializers. Because no sign is provided, the new\n    ///    instance is positive by definition.\n    internal init(limbs: Limbs) {\n        precondition(limbs != [], \"BInt can't be initialized with limbs == []\")\n        self.limbs = limbs\n    }\n    \n    /// Create an instance initialized with a sign and a limbs array.\n    internal init(sign: Bool, limbs: Limbs) {\n        self.init(limbs: limbs)\n        self.sign = sign\n    }\n    \n    /// Create an instance initialized with the value 0.\n    init() {\n        self.init(limbs: [0])\n    }\n    \n    /// Create an instance initialized to an integer value.\n    public init(_ z: Int) {\n        //    Since abs(Int.min) > Int.max, it is necessary to handle\n        //    z == Int.min as a special case.\n        if z == Int.min {\n            self.init(sign: true, limbs: [Limb(Int.max) + 1])\n            return\n        } else {\n            self.init(sign: z < 0, limbs: [Limb(abs(z))])\n        }\n    }\n    \n    /// Create an instance initialized to an unsigned integer value.\n    public init(_ n: UInt) {\n        self.init(limbs: [Limb(n)])\n    }\n    \n    /// Create an instance initialized to a string value.\n    public init?(_ str: String) {\n        var str = str\n        var sign = false\n        var base: Limbs = [1]\n        var limbs: Limbs = [0]\n        \n        limbs.reserveCapacity(Int(Double(str.count) / log10(pow(2.0, 64.0))))\n        \n        if str.hasPrefix(\"-\") {\n            str.remove(at: str.startIndex)\n            sign = str != \"0\"\n        }\n        \n        for chunk in String(str.reversed()).split(19).map({ String($0.reversed()) }) {\n            if let num = Limb(String(chunk)) {\n                limbs.addProductOf(multiplier: base, multiplicand: num)\n                base = base.multiplyingBy([10_000_000_000_000_000_000])\n            } else {\n                return nil\n            }\n        }\n        \n        self.init(sign: sign, limbs: limbs)\n    }\n    \n    /// Create an instance initialized to a string with the value of mathematical numerical system of the specified radix (base).\n    /// So for example, to get the value of hexadecimal string radix value must be set to 16.\n    public init?(_ nStr: String, radix: Int) {\n        if radix == 10 {\n            // regular string init is faster\n            // see metrics\n            self.init(nStr)\n            return\n        }\n        \n        var useString = nStr\n        if radix == 16 {\n            if useString.hasPrefix(\"0x\") {\n                useString = String(nStr.dropFirst(2))\n            }\n        }\n        \n        if radix == 8 {\n            if useString.hasPrefix(\"0o\") {\n                useString = String(nStr.dropFirst(2))\n            }\n        }\n        \n        if radix == 2 {\n            if useString.hasPrefix(\"0b\") {\n                useString = String(nStr.dropFirst(2))\n            }\n        }\n        \n        let bint16 = BInt(radix)\n        \n        var total = BInt(0)\n        var exp = BInt(1)\n        \n        for c in useString.reversed() {\n            let int = Int(String(c), radix: radix)\n            if int != nil {\n                let value = BInt(int!)\n                total = total + (value * exp)\n                exp = exp * bint16\n            } else {\n                return nil\n            }\n            \n        }\n        \n        self.init(String(describing: total))\n    }\n    \n    //    Requierd by protocol ExpressibleByFloatLiteral.\n    public init(floatLiteral value: Double) {\n        self.init(sign: value < 0.0, limbs: [Limb(value)])\n    }\n    \n    //    Required by protocol ExpressibleByIntegerLiteral.\n    public init(integerLiteral value: Int) {\n        self.init(value)\n    }\n    \n    // Required by protocol Numeric\n    public init?<T>(exactly source: T) where T: BinaryInteger {\n        self.init(Int(source))\n    }\n    \n    ///    Creates an integer from the given floating-point value, rounding toward zero.\n    public init<T>(_ source: T) where T: BinaryFloatingPoint {\n        self.init(Int(source))\n    }\n    \n    ///    Creates a new instance from the given integer.\n    public init<T>(_ source: T) where T: BinaryInteger {\n        self.init(Int(source))\n    }\n    \n    ///    Creates a new instance with the representable value that’s closest to the given integer.\n    public init<T>(clamping source: T) where T: BinaryInteger {\n        self.init(Int(source))\n    }\n    \n    ///    Creates an integer from the given floating-point value, if it can be represented\n    ///    exactly.\n    public init?<T>(exactly source: T) where T: BinaryFloatingPoint {\n        self.init(source)\n    }\n    \n    ///    Creates a new instance from the bit pattern of the given instance by sign-extending or\n    ///    truncating to fit this type.\n    public init<T>(truncatingIfNeeded source: T) where T: BinaryInteger {\n        self.init(source)\n    }\n    \n    //\n    //\n    // MARK: - CustomStringConvertible conformance\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        CustomStringConvertible conformance        |||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public var description: String {\n        return (self.sign ? \"-\" : \"\").appending(self.limbs.decimalRepresentation)\n    }\n    \n    public init?(number: String, withBase base: Int) {\n        self.init(number.convertingBase(from: base, toBase: 10))\n    }\n    \n    public func asString(withBase base: Int) -> String {\n        let str = self.limbs.decimalRepresentation\n        let newStr = str.convertingBase(from: 10, toBase: base)\n        \n        if self.sign { return \"-\".appending(newStr) }\n        return newStr\n    }\n    \n    //\n    //\n    // MARK: - Struct functions\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Struct functions        ||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    ///    Returns BInt value as an integer, if possible.\n    func toInt() -> Int? {\n        //    Conversion only works when self has only one limb thats smaller or\n        //    equal to abs(Int.min).\n        \n        if self.limbs.count != 1 { return nil }\n        \n        let number = self.limbs[0]\n        \n        //    Self is within the range of Int\n        if number <= Limb(Int.max) {\n            return self.sign ? -Int(number) : Int(number)\n        }\n        \n        //    Special case: self == Int.min\n        if number == (Limb(Int.max) + 1) && self.sign {\n            return Int.min\n        }\n        \n        return nil\n    }\n    \n    var rawValue: (sign: Bool, limbs: [UInt64]) {\n        return (self.sign, self.limbs)\n    }\n    \n    ///    A Boolean value indicating whether this type is a signed integer type.\n    public static var isSigned: Bool {\n        return true\n    }\n    \n    ///    Returns -1 if this value is negative and 1 if it’s positive; otherwise, 0.\n    public func signum() -> BInt {\n        if self.isZero() { return BInt(0) } else if self.isPositive() { return BInt(1) } else { return BInt(-1) }\n    }\n    \n    func isPositive() -> Bool { return !self.sign }\n    func isNegative() -> Bool { return  self.sign }\n    func isZero() -> Bool { return self.limbs[0] == 0 && self.limbs.count == 1 }\n    func isNotZero() -> Bool { return self.limbs[0] != 0 || self.limbs.count > 1 }\n    func isOdd() -> Bool { return self.limbs[0] & 1 == 1 }\n    func isEven() -> Bool { return self.limbs[0] & 1 == 0 }\n    \n    ///    The number of bits in the current binary representation of this value.\n    public var bitWidth: Int {\n        return self.limbs.bitWidth\n    }\n    \n    ///    The number of trailing zeros in this value’s binary representation.\n    public var trailingZeroBitCount: Int {\n        var i = 0\n        while true {\n            if self.limbs.getBit(at: i) { return i }\n            i += 1\n        }\n    }\n    \n    /// Serialization\n    public func serialize() -> Data {\n        let byteCount = (bitWidth + 7) / 8\n        guard byteCount > 0 else { return Data()}\n        \n        var data = Data(count: byteCount)\n        data.withUnsafeMutableBytes { (pointer) -> Void in\n            let p = pointer.bindMemory(to: UInt8.self)\n            var i = byteCount - 1\n            for var word in words {\n                for _ in 0 ..< UInt.bitWidth / 8 {\n                    p[i] = UInt8(word & 0xFF)\n                    word >>= 8\n                    if i == 0 {\n                        assert(word == 0)\n                        break\n                    }\n                    i -= 1\n                }\n            }\n        }\n        return data\n    }\n    \n    //\n    //\n    // MARK: - BInt Shifts\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Shifts        |||||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public static func <<<T: BinaryInteger>(lhs: BInt, rhs: T) -> BInt {\n        if rhs < 0 { return lhs >> rhs }\n        \n        let limbs = lhs.limbs.shiftingUp(Int(rhs))\n        let sign = lhs.isNegative() && !limbs.equalTo(0)\n        \n        return BInt(sign: sign, limbs: limbs)\n    }\n    \n    public static func <<=<T: BinaryInteger>(lhs: inout BInt, rhs: T) {\n        lhs.limbs.shiftUp(Int(rhs))\n    }\n    \n    public static func >><T: BinaryInteger>(lhs: BInt, rhs: T) -> BInt {\n        if rhs < 0 { return lhs << rhs }\n        return BInt(sign: lhs.sign, limbs: lhs.limbs.shiftingDown(Int(rhs)))\n    }\n    \n    public static func >>=<T: BinaryInteger>(lhs: inout BInt, rhs: T) {\n        lhs.limbs.shiftDown(Int(rhs))\n    }\n    \n    //\n    //\n    // MARK: - BInt Bitwise AND\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt BInt Bitwise AND        |||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    ///    Returns the result of performing a bitwise AND operation on the two given values.\n    public static func &(lhs: BInt, rhs: BInt) -> BInt {\n        var res: Limbs = [0]\n        \n        for i in 0..<(64 * Swift.max(lhs.limbs.count, rhs.limbs.count)) {\n            let newBit = lhs.limbs.getBit(at: i) && lhs.limbs.getBit(at: i)\n            res.setBit(at: i, to: newBit)\n        }\n        \n        return BInt(sign: lhs.sign && rhs.sign, limbs: res)\n    }\n    \n    //    static func &(lhs: Int, rhs: BInt) -> BInt\n    //    static func &(lhs: BInt, rhs: Int) -> BInt\n    \n    ///    Stores the result of performing a bitwise AND operation on the two given values in the\n    ///    left-hand-side variable.\n    public static func &=(lhs: inout BInt, rhs: BInt) {\n        let res = lhs & rhs\n        lhs = res\n    }\n    \n    //    static func &=(inout lhs: Int, rhs: BInt)\n    //    static func &=(inout lhs: BInt, rhs: Int)\n    \n    //\n    //\n    // MARK: - BInt Bitwise OR\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Bitwise OR        |||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public static func |(lhs: BInt, rhs: BInt) -> BInt {\n        var res: Limbs = [0]\n        \n        for i in 0..<(64 * Swift.max(lhs.limbs.count, rhs.limbs.count)) {\n            let newBit = lhs.limbs.getBit(at: i) || lhs.limbs.getBit(at: i)\n            res.setBit(at: i, to: newBit)\n        }\n        \n        return BInt(sign: lhs.sign || rhs.sign, limbs: res)\n    }\n    \n    //    static func |(lhs: Int, rhs: BInt) -> BInt\n    //    static func |(lhs: BInt, rhs: Int) -> BInt\n    //\n    public static func |=(lhs: inout BInt, rhs: BInt) {\n        let res = lhs | rhs\n        lhs = res\n    }\n    //    static func |=(inout lhs: Int, rhs: BInt)\n    //    static func |=(inout lhs: BInt, rhs: Int)\n    \n    //\n    //\n    // MARK: - BInt Bitwise OR\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Bitwise XOR        ||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public static func ^(lhs: BInt, rhs: BInt) -> BInt {\n        var res: Limbs = [0]\n        \n        for i in 0..<(64 * Swift.max(lhs.limbs.count, rhs.limbs.count)) {\n            let newBit = lhs.limbs.getBit(at: i) != lhs.limbs.getBit(at: i)\n            res.setBit(at: i, to: newBit)\n        }\n        \n        return BInt(sign: lhs.sign != rhs.sign, limbs: res)\n    }\n    \n    public static func ^=(lhs: inout BInt, rhs: BInt) {\n        let res = lhs | rhs\n        lhs = res\n    }\n    \n    //\n    //\n    // MARK: - BInt Bitwise NOT\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Bitwise NOT        ||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public prefix static func ~(x: BInt) -> BInt {\n        var res = x.limbs\n        for i in 0..<(res.bitWidth) {\n            res.setBit(at: i, to: !res.getBit(at: i))\n        }\n        \n        while res.last! == 0 && res.count > 1 { res.removeLast() }\n        \n        return BInt(sign: !x.sign, limbs: res)\n    }\n    \n    //\n    //\n    // MARK: - BInt Addition\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Addition        |||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public prefix static func +(x: BInt) -> BInt {\n        return x\n    }\n    \n    // Required by protocol Numeric\n    public static func +=(lhs: inout BInt, rhs: BInt) {\n        if lhs.sign == rhs.sign {\n            lhs.limbs.addLimbs(rhs.limbs)\n            return\n        }\n        \n        let rhsIsMin = rhs.limbs.lessThan(lhs.limbs)\n        lhs.limbs.difference(rhs.limbs)\n        lhs.sign = (rhs.sign && !rhsIsMin) || (lhs.sign && rhsIsMin) // DNF minimization\n        \n        if lhs.isZero() { lhs.sign = false }\n    }\n    \n    // Required by protocol Numeric\n    public static func +(lhs: BInt, rhs: BInt) -> BInt {\n        var lhs = lhs\n        lhs += rhs\n        return lhs\n    }\n    \n    static func +(lhs: Int, rhs: BInt) -> BInt { return BInt(lhs) + rhs }\n    static func +(lhs: BInt, rhs: Int) -> BInt { return lhs + BInt(rhs) }\n    \n    static func +=(lhs: inout  Int, rhs: BInt) { lhs += (BInt(lhs) + rhs).toInt()! }\n    static func +=(lhs: inout BInt, rhs: Int) { lhs += BInt(rhs)                 }\n    \n    //\n    //\n    // MARK: - BInt Negation\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Negation        |||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    // Required by protocol SignedNumeric\n    public mutating func negate() {\n        if self.isNotZero() { self.sign = !self.sign }\n    }\n    \n    // Required by protocol SignedNumeric\n    public static prefix func -(n: BInt) -> BInt {\n        var n = n\n        n.negate()\n        return n\n    }\n    \n    //\n    //\n    // MARK: - BInt Subtraction\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Subtraction        ||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    // Required by protocol Numeric\n    public static func -(lhs: BInt, rhs: BInt) -> BInt {\n        return lhs + -rhs\n    }\n    \n    static func -(lhs: Int, rhs: BInt) -> BInt { return BInt(lhs) - rhs }\n    static func -(lhs: BInt, rhs: Int) -> BInt { return lhs - BInt(rhs) }\n    \n    // Required by protocol Numeric\n    public static func -=(lhs: inout BInt, rhs: BInt) { lhs += -rhs                        }\n    static func -=(lhs: inout  Int, rhs: BInt) { lhs = (BInt(lhs) - rhs).toInt()! }\n    static func -=(lhs: inout BInt, rhs: Int) { lhs -= BInt(rhs)                  }\n    \n    //\n    //\n    // MARK: - BInt Multiplication\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Multiplication        |||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    // Required by protocol Numeric\n    public static func *(lhs: BInt, rhs: BInt) -> BInt {\n        let sign = !(lhs.sign == rhs.sign || lhs.isZero() || rhs.isZero())\n        return BInt(sign: sign, limbs: lhs.limbs.multiplyingBy(rhs.limbs))\n    }\n    \n    static func *(lhs: Int, rhs: BInt) -> BInt { return BInt(lhs) * rhs }\n    static func *(lhs: BInt, rhs: Int) -> BInt { return lhs * BInt(rhs) }\n    \n    // Required by protocol SignedNumeric\n    public static func *=(lhs: inout BInt, rhs: BInt) { lhs = lhs * rhs                  }\n    static func *=(lhs: inout  Int, rhs: BInt) { lhs = (BInt(lhs) * rhs).toInt()! }\n    static func *=(lhs: inout BInt, rhs: Int) { lhs = lhs * BInt(rhs)            }\n    \n    //\n    //\n    // MARK: - BInt Exponentiation\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Exponentiation        |||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    static func **(lhs: BInt, rhs: Int) -> BInt {\n        precondition(rhs >= 0, \"BInts can't be exponentiated with exponents < 0\")\n        return BInt(sign: lhs.sign && (rhs % 2 != 0), limbs: lhs.limbs.exponentiating(rhs))\n    }\n    \n    func factorial() -> BInt {\n        precondition(!self.sign, \"Can't calculate the factorial of an negative number\")\n        \n        return BInt(limbs: Limbs.recursiveMul(0, Limb(self.toInt()!)))\n    }\n    \n    //\n    //\n    // MARK: - BInt Division\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Division        |||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    ///    Returns the quotient and remainder of this value divided by the given value.\n    public func quotientAndRemainder(dividingBy rhs: BInt) -> (quotient: BInt, remainder: BInt) {\n        let limbRes = self.limbs.divMod(rhs.limbs)\n        return (BInt(limbs: limbRes.quotient), BInt(limbs: limbRes.remainder))\n    }\n    \n    public static func /(lhs: BInt, rhs: BInt) -> BInt {\n        let limbs = lhs.limbs.divMod(rhs.limbs).quotient\n        let sign = (lhs.sign != rhs.sign) && !limbs.equalTo(0)\n        \n        return BInt(sign: sign, limbs: limbs)\n    }\n    \n    static func /(lhs: Int, rhs: BInt) -> BInt { return BInt(lhs) / rhs }\n    static func /(lhs: BInt, rhs: Int) -> BInt { return lhs / BInt(rhs) }\n    \n    public static func /=(lhs: inout BInt, rhs: BInt) { lhs = lhs / rhs       }\n    static func /=(lhs: inout BInt, rhs: Int) { lhs = lhs / BInt(rhs) }\n    \n    //\n    //\n    // MARK: - BInt Modulus\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Modulus        ||||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    public static func %(lhs: BInt, rhs: BInt) -> BInt {\n        let limbs = lhs.limbs.divMod(rhs.limbs).remainder\n        let sign = lhs.sign && !limbs.equalTo(0)\n        \n        return BInt(sign: sign, limbs: limbs)\n    }\n    \n    static func %(lhs: Int, rhs: BInt) -> BInt { return BInt(lhs) % rhs  }\n    static func %(lhs: BInt, rhs: Int) -> BInt { return lhs % BInt(rhs) }\n    \n    public static func %=(lhs: inout BInt, rhs: BInt) { lhs = lhs % rhs       }\n    static func %=(lhs: inout BInt, rhs: Int) { lhs = lhs % BInt(rhs) }\n    \n    //\n    //\n    // MARK: - BInt Comparing\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        BInt Comparing        ||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    // Required by protocol Equatable\n    public static func ==(lhs: BInt, rhs: BInt) -> Bool {\n        if lhs.sign != rhs.sign { return false }\n        return lhs.limbs == rhs.limbs\n    }\n    \n    static func ==<T: BinaryInteger>(lhs: BInt, rhs: T) -> Bool {\n        if lhs.limbs.count != 1 { return false }\n        return lhs.limbs[0] == rhs\n    }\n    \n    static func ==<T: BinaryInteger>(lhs: T, rhs: BInt) -> Bool { return rhs == lhs }\n    \n    static func !=(lhs: BInt, rhs: BInt) -> Bool {\n        if lhs.sign != rhs.sign { return true }\n        return lhs.limbs != rhs.limbs\n    }\n    \n    static func !=<T: BinaryInteger>(lhs: BInt, rhs: T) -> Bool {\n        if lhs.limbs.count != 1 { return true }\n        return lhs.limbs[0] != rhs\n    }\n    \n    static func !=<T: BinaryInteger>(lhs: T, rhs: BInt) -> Bool { return rhs != lhs }\n    \n    // Required by protocol Comparable\n    public static func <(lhs: BInt, rhs: BInt) -> Bool {\n        if lhs.sign != rhs.sign { return lhs.sign }\n        \n        if lhs.sign { return rhs.limbs.lessThan(lhs.limbs) }\n        return lhs.limbs.lessThan(rhs.limbs)\n    }\n    \n    static func <<T: BinaryInteger>(lhs: BInt, rhs: T) -> Bool {\n        if lhs.sign != (rhs < 0) { return lhs.sign }\n        \n        if lhs.sign {\n            if lhs.limbs.count != 1 { return true }\n            return rhs < lhs.limbs[0]\n        } else {\n            if lhs.limbs.count != 1 { return false }\n            return lhs.limbs[0] < rhs\n        }\n        \n    }\n    \n    static func <(lhs: Int, rhs: BInt) -> Bool { return BInt(lhs) < rhs }\n    static func <(lhs: BInt, rhs: Int) -> Bool { return lhs < BInt(rhs) }\n    \n    // Required by protocol Comparable\n    public static func >(lhs: BInt, rhs: BInt) -> Bool { return rhs < lhs       }\n    static func >(lhs: Int, rhs: BInt) -> Bool { return BInt(lhs) > rhs }\n    static func >(lhs: BInt, rhs: Int) -> Bool { return lhs > BInt(rhs) }\n    \n    // Required by protocol Comparable\n    public static func <=(lhs: BInt, rhs: BInt) -> Bool { return !(rhs < lhs)       }\n    static func <=(lhs: Int, rhs: BInt) -> Bool { return !(rhs < BInt(lhs)) }\n    static func <=(lhs: BInt, rhs: Int) -> Bool { return !(BInt(rhs) < lhs) }\n    \n    // Required by protocol Comparable\n    public static func >=(lhs: BInt, rhs: BInt) -> Bool { return !(lhs < rhs)       }\n    static func >=(lhs: Int, rhs: BInt) -> Bool { return !(BInt(lhs) < rhs) }\n    static func >=(lhs: BInt, rhs: Int) -> Bool { return !(lhs < BInt(rhs)) }\n}\n//\n//\n// MARK: - String operations\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||        String operations        |||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//\n//\n//\nfileprivate extension String {\n    // Splits the string into equally sized parts (exept for the last one).\n    func split(_ count: Int) -> [String] {\n        return stride(from: 0, to: self.count, by: count).map { i -> String in\n            let start = index(startIndex, offsetBy: i)\n            let end = index(start, offsetBy: count, limitedBy: endIndex) ?? endIndex\n            return String(self[start..<end])\n        }\n    }\n    \n    ///    Assuming that this String represents a number in some base fromBase, return a String\n    ///    that contains the number converted to base toBase.\n    func convertingBase(from: Int, toBase: Int) -> String {\n        let chars: [Character] = [\n            \"0\", \"1\", \"2\", \"3\", \"4\", \"5\", \"6\", \"7\", \"8\", \"9\", \"a\", \"b\",\n            \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\", \"m\", \"n\",\n            \"o\", \"p\", \"q\", \"r\", \"s\", \"t\", \"u\", \"v\", \"w\", \"x\", \"y\", \"z\",\n            \"A\", \"B\", \"C\", \"D\", \"E\", \"F\", \"G\", \"H\", \"I\", \"J\", \"K\", \"L\",\n            \"M\", \"N\", \"O\", \"P\", \"Q\", \"R\", \"S\", \"T\", \"U\", \"V\", \"W\", \"X\",\n            \"Y\", \"Z\"\n        ]\n        \n        var res = \"\"\n        var number = self\n        \n        if number.hasPrefix(\"-\") {\n            res = \"-\"\n            number.removeFirst()\n        }\n        \n        var sum = BInt(0)\n        var multiplier = BInt(1)\n        \n        for char in number.reversed() {\n            if let digit = chars.firstIndex(of: char) {\n                precondition(digit < from)\n                \n                sum += digit * multiplier\n                multiplier *= from\n            } else {\n                fatalError()\n            }\n        }\n        \n        repeat {\n            res.insert(chars[(sum % toBase).toInt()!], at: res.startIndex)\n            sum /= BInt(toBase)\n        }\n            while sum != 0\n        \n        return res\n    }\n}\nprivate let DigitBase: Digit = 1_000_000_000_000_000_000\nprivate let DigitHalfBase: Digit = 1_000_000_000\nprivate let DigitZeros = 18\nfileprivate extension Array where Element == Limb {\n    var decimalRepresentation: String {\n        // First, convert limbs to digits\n        var digits: Digits = [0]\n        var power: Digits = [1]\n        \n        for limb in self {\n            let digit = (limb >= DigitBase)\n                ? [limb % DigitBase, limb / DigitBase]\n                : [limb]\n            \n            digits.addProductOfDigits(digit, power)\n            \n            var nextPower: Digits = [0]\n            nextPower.addProductOfDigits(power, [446_744_073_709_551_616, 18])\n            power = nextPower\n        }\n        \n        // Then, convert digits to string\n        var res = String(digits.last!)\n        \n        if digits.count == 1 { return res }\n        \n        for i in (0..<(digits.count - 1)).reversed() {\n            let str = String(digits[i])\n            \n            let leadingZeros = String(repeating: \"0\", count: DigitZeros - str.count)\n            \n            res.append(leadingZeros.appending(str))\n        }\n        \n        return res\n    }\n}\nfileprivate extension Digit {\n    mutating func addReportingOverflowDigit(_ addend: Digit) -> Bool {\n        self = self &+ addend\n        if self >= DigitBase { self -= DigitBase; return true }\n        return false\n    }\n    \n    func multipliedFullWidthDigit(by multiplicand: Digit) -> (Digit, Digit) {\n        let (lLo, lHi) = (self % DigitHalfBase, self / DigitHalfBase)\n        let (rLo, rHi) = (multiplicand % DigitHalfBase, multiplicand / DigitHalfBase)\n        \n        let K = (lHi * rLo) + (rHi * lLo)\n        \n        var resLo = (lLo * rLo) + ((K % DigitHalfBase) * DigitHalfBase)\n        var resHi = (lHi * rHi) + (K / DigitHalfBase)\n        \n        if resLo >= DigitBase {\n            resLo -= DigitBase\n            resHi += 1\n        }\n        \n        return (resLo, resHi)\n    }\n}\nfileprivate extension Array where Element == Digit {\n    mutating func addOneDigit(\n        _ addend: Limb,\n        padding paddingZeros: Int\n        ) {\n        let sc = self.count\n        \n        if paddingZeros > sc { self += Digits(repeating: 0, count: paddingZeros &- sc) }\n        if paddingZeros >= sc { self.append(addend); return }\n        \n        // Now, i < sc\n        var i = paddingZeros\n        \n        let ovfl = self[i].addReportingOverflowDigit(addend)\n        \n        while ovfl {\n            i += 1\n            if i == sc { self.append(1); return }\n            self[i] += 1\n            if self[i] != DigitBase { return }\n            self[i] = 0\n        }\n    }\n    \n    mutating func addTwoDigit(\n        _ addendLow: Limb,\n        _ addendHigh: Limb,\n        padding paddingZeros: Int) {\n        let sc = self.count\n        \n        if paddingZeros > sc { self += Digits(repeating: 0, count: paddingZeros &- sc) }\n        if paddingZeros >= sc { self += [addendLow, addendHigh]; return }\n        \n        // Now, i < sc\n        var i = paddingZeros\n        var newDigit: Digit\n        \n        let ovfl1 = self[i].addReportingOverflowDigit(addendLow)\n        i += 1\n        \n        if i == sc {\n            newDigit = (addendHigh &+ (ovfl1 ? 1 : 0)) % DigitBase\n            self.append(newDigit)\n            if newDigit == 0 { self.append(1) }\n            return\n        }\n        \n        // Still, i < sc\n        var ovfl2 = self[i].addReportingOverflowDigit(addendHigh)\n        if ovfl1 {\n            self[i] += 1\n            if self[i] == DigitBase { self[i] = 0; ovfl2 = true }\n        }\n        \n        while ovfl2 {\n            i += 1\n            if i == sc { self.append(1); return }\n            self[i] += 1\n            if self[i] != DigitBase { return }\n            self[i] = 0\n        }\n    }\n    \n    mutating func addProductOfDigits(_ multiplier: Digits, _ multiplicand: Digits) {\n        let (mpc, mcc) = (multiplier.count, multiplicand.count)\n        self.reserveCapacity(mpc &+ mcc)\n        \n        var l, r, resLo, resHi: Digit\n        \n        for i in 0..<mpc {\n            l = multiplier[i]\n            if l == 0 { continue }\n            \n            for j in 0..<mcc {\n                r = multiplicand[j]\n                if r == 0 { continue }\n                \n                (resLo, resHi) = l.multipliedFullWidthDigit(by: r)\n                \n                if resHi == 0 {\n                    self.addOneDigit(resLo, padding: i + j)\n                } else {\n                    self.addTwoDigit(resLo, resHi, padding: i + j)\n                }\n            }\n        }\n    }\n}\n//\n//\n// MARK: - Limbs extension\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||        Limbs extension        |||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||\n//    ————————————————————————————————————————————————————————————————————————————————————————————\n//\n//\n//\n// Extension to Limbs type\nfileprivate extension Array where Element == Limb {\n    //\n    //\n    // MARK: - Limbs bitlevel\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs bitlevel        ||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    /// Returns the number of bits that contribute to the represented number, ignoring all\n    /// leading zeros.\n    var bitWidth: Int {\n        var lastBits = 0\n        var last = self.last!\n        \n        while last != 0 {\n            last >>= 1\n            lastBits += 1\n        }\n        \n        return ((self.count - 1) * 64) + lastBits\n    }\n    \n    ///    Get bit i of limbs.\n    func getBit(at i: Int) -> Bool {\n        let limbIndex = Int(Limb(i) >> 6)\n        \n        if limbIndex >= self.count { return false }\n        \n        let bitIndex = Limb(i) & 0b111_111\n        \n        return (self[limbIndex] & (1 << bitIndex)) != 0\n    }\n    \n    /// Set bit i of limbs to b. b must be 0 for false, and everything else for true.\n    mutating func setBit(\n        at i: Int,\n        to bit: Bool\n        ) {\n        let limbIndex = Int(Limb(i) >> 6)\n        \n        if limbIndex >= self.count && !bit { return }\n        \n        let bitIndex = Limb(i) & 0b111_111\n        \n        while limbIndex >= self.count { self.append(0) }\n        \n        if bit {\n            self[limbIndex] |= (1 << bitIndex)\n        } else {\n            self[limbIndex] &= ~(1 << bitIndex)\n        }\n    }\n    \n    //\n    //\n    // MARK: - Limbs Shifting\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Shifting        ||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    mutating func shiftUp(_ shift: Int) {\n        // No shifting is required in this case\n        if shift == 0 || self.equalTo(0) { return }\n        \n        let limbShifts = shift >> 6\n        let bitShifts = Limb(shift) & 0x3f\n        \n        if bitShifts != 0 {\n            var previousCarry = Limb(0)\n            var carry = Limb(0)\n            var ele = Limb(0) // use variable to minimize array accesses\n            \n            for i in 0..<self.count {\n                ele = self[i]\n                \n                carry = ele >> (64 - bitShifts)\n                \n                ele <<= bitShifts\n                ele |= previousCarry // carry from last step\n                previousCarry = carry\n                \n                self[i] = ele\n            }\n            \n            if previousCarry != 0 { self.append(previousCarry) }\n        }\n        \n        if limbShifts != 0 {\n            self.insert(contentsOf: Limbs(repeating: 0, count: limbShifts), at: 0)\n        }\n    }\n    \n    func shiftingUp(_ shift: Int) -> Limbs {\n        var res = self\n        res.shiftUp(shift)\n        return res\n    }\n    \n    mutating func shiftDown(_ shift: Int) {\n        if shift == 0 || self.equalTo(0) { return }\n        \n        let limbShifts = shift >> 6\n        let bitShifts = Limb(shift) & 0x3f\n        \n        if limbShifts >= self.count {\n            self = [0]\n            return\n        }\n        \n        self.removeSubrange(0..<limbShifts)\n        \n        if bitShifts != 0 {\n            var previousCarry = Limb(0)\n            var carry = Limb(0)\n            var ele = Limb(0) // use variable to minimize array accesses\n            \n            var i = self.count - 1 // use while for high performance\n            while i >= 0 {\n                ele = self[i]\n                \n                carry = ele << (64 - bitShifts)\n                \n                ele >>= bitShifts\n                ele |= previousCarry\n                previousCarry = carry\n                \n                self[i] = ele\n                \n                i -= 1\n            }\n        }\n        \n        if self.last! == 0 && self.count != 1 { self.removeLast() }\n    }\n    \n    func shiftingDown(_ shift: Int) -> Limbs {\n        var res = self\n        res.shiftDown(shift)\n        return res\n    }\n    \n    //\n    //\n    // MARK: - Limbs Addition\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Addition        ||||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    mutating func addLimbs(_ addend: Limbs) {\n        let (sc, ac) = (self.count, addend.count)\n        \n        var (newLimb, ovfl) = (Limb(0), false)\n        \n        let minCount = Swift.min(sc, ac)\n        \n        var i = 0\n        while i < minCount {\n            if ovfl {\n                (newLimb, ovfl) = self[i].addingReportingOverflow(addend[i])\n                newLimb = newLimb &+ 1\n                \n                ovfl = ovfl || newLimb == 0\n            } else {\n                (newLimb, ovfl) = self[i].addingReportingOverflow(addend[i])\n            }\n            \n            self[i] = newLimb\n            i += 1\n        }\n        \n        while ovfl {\n            if i < sc {\n                if i < ac {\n                    (newLimb, ovfl) = self[i].addingReportingOverflow(addend[i])\n                    newLimb = newLimb &+ 1\n                    ovfl = ovfl || newLimb == 0\n                } else {\n                    (newLimb, ovfl) = self[i].addingReportingOverflow(1)\n                }\n                \n                self[i] = newLimb\n            } else {\n                if i < ac {\n                    (newLimb, ovfl) = addend[i].addingReportingOverflow(1)\n                    self.append(newLimb)\n                } else {\n                    self.append(1)\n                    return\n                }\n            }\n            \n            i += 1\n        }\n        \n        if self.count < ac {\n            self.append(contentsOf: addend.suffix(from: i))\n        }\n    }\n    \n    /// Adding Limbs and returning result\n    func adding(_ addend: Limbs) -> Limbs {\n        var res = self\n        res.addLimbs(addend)\n        return res\n    }\n    \n    // CURRENTLY NOT USED:\n    ///    Add the addend to Limbs, while using a padding at the lower end.\n    ///    Every zero is a Limb, that means one padding zero equals 64 padding bits\n    mutating func addLimbs(\n        _ addend: Limbs,\n        padding paddingZeros: Int\n        ) {\n        let sc = self.count\n        \n        if paddingZeros > sc { self += Digits(repeating: 0, count: paddingZeros &- sc) }\n        if paddingZeros >= sc { self += addend; return }\n        \n        // Now, i < sc\n        let ac = addend.count &+ paddingZeros\n        \n        var (newLimb, ovfl) = (Limb(0), false)\n        \n        let minCount = Swift.min(sc, ac)\n        \n        var i = paddingZeros\n        while i < minCount {\n            if ovfl {\n                (newLimb, ovfl) = self[i].addingReportingOverflow(addend[i &- paddingZeros])\n                newLimb = newLimb &+ 1\n                self[i] = newLimb\n                ovfl = ovfl || newLimb == 0\n            } else {\n                (self[i], ovfl) = self[i].addingReportingOverflow(addend[i &- paddingZeros])\n            }\n            \n            i += 1\n        }\n        \n        while ovfl {\n            if i < sc {\n                let adding = i < ac ? addend[i &- paddingZeros] &+ 1 : 1\n                (self[i], ovfl) = self[i].addingReportingOverflow(adding)\n                ovfl = ovfl || adding == 0\n            } else {\n                if i < ac {\n                    (newLimb, ovfl) = addend[i &- paddingZeros].addingReportingOverflow(1)\n                    self.append(newLimb)\n                } else {\n                    self.append(1)\n                    return\n                }\n            }\n            \n            i += 1\n        }\n        \n        if self.count < ac {\n            self.append(contentsOf: addend.suffix(from: i &- paddingZeros))\n        }\n    }\n    \n    mutating func addOneLimb(\n        _ addend: Limb,\n        padding paddingZeros: Int\n        ) {\n        let sc = self.count\n        \n        if paddingZeros > sc { self += Digits(repeating: 0, count: paddingZeros &- sc) }\n        if paddingZeros >= sc { self.append(addend); return }\n        \n        // Now, i < lhc\n        var i = paddingZeros\n        \n        var ovfl: Bool\n        (self[i], ovfl) = self[i].addingReportingOverflow(addend)\n        \n        while ovfl {\n            i += 1\n            if i == sc { self.append(1); return }\n            (self[i], ovfl) = self[i].addingReportingOverflow(1)\n        }\n    }\n    \n    /// Basically self.addOneLimb([addendLow, addendHigh], padding: paddingZeros), but faster\n    mutating func addTwoLimb(\n        _ addendLow: Limb,\n        _ addendHigh: Limb,\n        padding paddingZeros: Int) {\n        let sc = self.count\n        \n        if paddingZeros > sc { self += Digits(repeating: 0, count: paddingZeros &- sc) }\n        if paddingZeros >= sc { self += [addendLow, addendHigh]; return }\n        \n        // Now, i < sc\n        var i = paddingZeros\n        var newLimb: Limb\n        \n        var ovfl1: Bool\n        (self[i], ovfl1) = self[i].addingReportingOverflow(addendLow)\n        i += 1\n        \n        if i == sc {\n            newLimb = addendHigh &+ (ovfl1 ? 1 : 0)\n            self.append(newLimb)\n            if newLimb == 0 { self.append(1) }\n            return\n        }\n        \n        // Still, i < sc\n        var ovfl2: Bool\n        (self[i], ovfl2) = self[i].addingReportingOverflow(addendHigh)\n        \n        if ovfl1 {\n            self[i] = self[i] &+ 1\n            if self[i] == 0 { ovfl2 = true }\n        }\n        \n        while ovfl2 {\n            i += 1\n            if i == sc { self.append(1); return }\n            (self[i], ovfl2) = self[i].addingReportingOverflow(1)\n        }\n    }\n    \n    //\n    //\n    // MARK: - Limbs Subtraction\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Subtraction        |||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    /// Calculates difference between Limbs in left limb\n    mutating func difference(_ subtrahend: Limbs) {\n        var subtrahend = subtrahend\n        // swap to get difference\n        if self.lessThan(subtrahend) { swap(&self, &subtrahend) }\n        \n        let rhc = subtrahend.count\n        var ovfl = false\n        \n        var i = 0\n        \n        // skip first zeros\n        while i < rhc && subtrahend[i] == 0 { i += 1 }\n        \n        while i < rhc {\n            if ovfl {\n                (self[i], ovfl) = self[i].subtractingReportingOverflow(subtrahend[i])\n                self[i] = self[i] &- 1\n                ovfl = ovfl || self[i] == Limb.max\n            } else {\n                (self[i], ovfl) = self[i].subtractingReportingOverflow(subtrahend[i])\n            }\n            \n            i += 1\n        }\n        \n        while ovfl {\n            if i >= self.count {\n                self.append(Limb.max)\n                break\n            }\n            \n            (self[i], ovfl) = self[i].subtractingReportingOverflow(1)\n            \n            i += 1\n        }\n        \n        if self.count > 1 && self.last! == 0 // cut excess zeros if required\n        {\n            var j = self.count - 2\n            while j >= 1 && self[j] == 0 { j -= 1 }\n            \n            self.removeSubrange((j + 1)..<self.count)\n        }\n    }\n    \n    func differencing(_ subtrahend: Limbs) -> Limbs {\n        var res = self\n        res.difference(subtrahend)\n        return res\n    }\n    \n    //\n    //\n    // MARK: - Limbs Multiplication\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Multiplication        |||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    mutating func addProductOf(\n        multiplier: Limbs,\n        multiplicand: Limbs\n        ) {\n        let (mpc, mcc) = (multiplier.count, multiplicand.count)\n        \n        self.reserveCapacity(mpc + mcc)\n        \n        // Minimize array subscript calls\n        var l, r, mulHi, mulLo: Limb\n        \n        for i in 0..<mpc {\n            l = multiplier[i]\n            if l == 0 { continue }\n            \n            for j in 0..<mcc {\n                r = multiplicand[j]\n                if r == 0 { continue }\n                \n                (mulHi, mulLo) = l.multipliedFullWidth(by: r)\n                \n                if mulHi != 0 { self.addTwoLimb(mulLo, mulHi, padding: i + j) } else { self.addOneLimb(mulLo, padding: i + j) }\n            }\n        }\n    }\n    \n    // Perform res += (lhs * r)\n    mutating func addProductOf(\n        multiplier: Limbs,\n        multiplicand: Limb\n        ) {\n        if multiplicand < 2 {\n            if multiplicand == 1 { self.addLimbs(multiplier) }\n            // If r == 0 then do nothing with res\n            return\n        }\n        \n        // Minimize array subscript calls\n        var l, mulHi, mulLo: Limb\n        \n        for i in 0..<multiplier.count {\n            l = multiplier[i]\n            if l == 0 { continue }\n            \n            (mulHi, mulLo) = l.multipliedFullWidth(by: multiplicand)\n            \n            if mulHi != 0 { self.addTwoLimb(mulLo, mulHi, padding: i) } else {          self.addOneLimb(mulLo, padding: i) }\n        }\n    }\n    \n    func multiplyingBy(_ multiplicand: Limbs) -> Limbs {\n        var res: Limbs = [0]\n        res.addProductOf(multiplier: self, multiplicand: multiplicand)\n        return res\n    }\n    \n    func squared() -> Limbs {\n        var res: Limbs = [0]\n        res.reserveCapacity(2 * self.count)\n        \n        // Minimize array subscript calls\n        var l, r, mulHi, mulLo: Limb\n        \n        for i in 0..<self.count {\n            l = self[i]\n            if l == 0 { continue }\n            \n            for j in 0...i {\n                r = self[j]\n                if r == 0 { continue }\n                \n                (mulHi, mulLo) = l.multipliedFullWidth(by: r)\n                \n                if mulHi != 0 {\n                    if i != j { res.addTwoLimb(mulLo, mulHi, padding: i + j) }\n                    res.addTwoLimb(mulLo, mulHi, padding: i + j)\n                } else {\n                    if i != j { res.addOneLimb(mulLo, padding: i + j) }\n                    res.addOneLimb(mulLo, padding: i + j)\n                }\n            }\n        }\n        \n        return res\n    }\n    \n    //\n    //\n    // MARK: - Limbs Exponentiation\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Exponentiation        ||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    // Exponentiation by squaring\n    func exponentiating(_ exponent: Int) -> Limbs {\n        if exponent == 0 { return [1] }\n        if exponent == 1 { return self }\n        \n        var base = self\n        var exponent = exponent\n        var y: Limbs = [1]\n        \n        while exponent > 1 {\n            if exponent & 1 != 0 { y = y.multiplyingBy(base) }\n            base = base.squared()\n            exponent >>= 1\n        }\n        \n        return base.multiplyingBy(y)\n    }\n    \n    /// Calculate (n + 1) * (n + 2) * ... * (k - 1) * k\n    static func recursiveMul(_ n: Limb, _ k: Limb) -> Limbs {\n        if n >= k - 1 { return [k] }\n        \n        let m = (n + k) >> 1\n        \n        return recursiveMul(n, m).multiplyingBy(recursiveMul(m, k))\n    }\n    \n    func factorial(_ base: Int) -> BInt {\n        return BInt(limbs: Limbs.recursiveMul(0, Limb(base)))\n    }\n    \n    //\n    //\n    // MARK: - Limbs Division and Modulo\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Division and Modulo        |||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    /// An O(n) division algorithm that returns quotient and remainder.\n    func divMod(_ divisor: Limbs) -> (quotient: Limbs, remainder: Limbs) {\n        precondition(!divisor.equalTo(0), \"Division or Modulo by zero not allowed\")\n        \n        if self.equalTo(0) { return ([0], [0]) }\n        \n        var (quotient, remainder): (Limbs, Limbs) = ([0], [0])\n        var (previousCarry, carry, ele): (Limb, Limb, Limb) = (0, 0, 0)\n        \n        // bits of lhs minus one bit\n        var i = (64 * (self.count - 1)) + Int(log2(Double(self.last!)))\n        \n        while i >= 0 {\n            // shift remainder by 1 to the left\n            for r in 0..<remainder.count {\n                ele = remainder[r]\n                carry = ele >> 63\n                ele <<= 1\n                ele |= previousCarry // carry from last step\n                previousCarry = carry\n                remainder[r] = ele\n            }\n            if previousCarry != 0 { remainder.append(previousCarry) }\n            \n            remainder.setBit(at: 0, to: self.getBit(at: i))\n            \n            if !remainder.lessThan(divisor) {\n                remainder.difference(divisor)\n                quotient.setBit(at: i, to: true)\n            }\n            \n            i -= 1\n        }\n        \n        return (quotient, remainder)\n    }\n    \n    /// Division with limbs, result is floored to nearest whole number.\n    func dividing(_ divisor: Limbs) -> Limbs {\n        return self.divMod(divisor).quotient\n    }\n    \n    /// Modulo with limbs, result is floored to nearest whole number.\n    func modulus(_ divisor: Limbs) -> Limbs {\n        return self.divMod(divisor).remainder\n    }\n    \n    //\n    //\n    // MARK: - Limbs Comparing\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //    ||||||||        Limbs Comparing        |||||||||||||||||||||||||||||||||||||||||||||||||\n    //    ————————————————————————————————————————————————————————————————————————————————————————\n    //\n    //\n    //\n    \n    //    Note:\n    //    a < b iff b > a\n    //    a <= b iff b >= a\n    //    but:\n    //    a < b iff !(a >= b)\n    //    a <= b iff !(a > b)\n    \n    func lessThan(_ compare: Limbs) -> Bool {\n        let lhsc = self.count\n        let rhsc = compare.count\n        \n        if lhsc != rhsc {\n            return lhsc < rhsc\n        }\n        \n        var i = lhsc - 1\n        while i >= 0 {\n            if self[i] != compare[i] { return self[i] < compare[i] }\n            i -= 1\n        }\n        \n        return false // lhs == rhs\n    }\n    \n    func equalTo(_ compare: Limb) -> Bool {\n        return self[0] == compare && self.count == 1\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_0NOTEQUAL.swift",
    "content": "//\n//  OP_0NOTEQUAL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// replaces number with True if it's not zero, False otherwise.\npublic struct OP0NotEqual: OpCodeProtocol {\n    public var value: UInt8 { return 0x92 }\n    public var name: String { return \"OP_0NOTEQUAL\" }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        context.pushToStack(input != 0)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_1ADD.swift",
    "content": "//\n//  OP_1ADD.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// 1 is added to the input.\npublic struct Op1Add: OpCodeProtocol {\n    public var value: UInt8 { return 0x8b }\n    public var name: String { return \"OP_1ADD\" }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        try context.pushToStack(input + 1)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_1SUB.swift",
    "content": "//\n//  OP_1SUB.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// 1 is subtracted from the input.\npublic struct Op1Sub: OpCodeProtocol {\n    public var value: UInt8 { return 0x8c }\n    public var name: String { return \"OP_1SUB\" }\n\n    // (in -- out)\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        try context.pushToStack(input - 1)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_2DIV.swift",
    "content": "//\n//  OP_2DIV.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// The input is divided by 2. disabled.\npublic struct Op2Div: OpCodeProtocol {\n    public var value: UInt8 { return 0x8e }\n    public var name: String { return \"OP_2DIV\" }\n\n    public func isEnabled() -> Bool {\n        return false\n    }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        try context.pushToStack(input / 2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_2MUL.swift",
    "content": "//\n//  OP_2MUL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// The input is multiplied by 2. disabled.\npublic struct Op2Mul: OpCodeProtocol {\n    public var value: UInt8 { return 0x8d }\n    public var name: String { return \"OP_2MUL\" }\n\n    public func isEnabled() -> Bool {\n        return false\n    }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        try context.pushToStack(input * 2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_ABS.swift",
    "content": "//\n//  OP_ABS.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// replaces number with its absolute value\npublic struct OpAbsolute: OpCodeProtocol {\n    public var value: UInt8 { return 0x90 }\n    public var name: String { return \"OP_ABS\" }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        try context.pushToStack(abs(input))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_ADD.swift",
    "content": "//\n//  OP_ADD.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x+y)\npublic struct OpAdd: OpCodeProtocol {\n    public var value: UInt8 { return 0x93 }\n    public var name: String { return \"OP_ADD\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 + x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_BOOLAND.swift",
    "content": "//\n//  OP_BOOLAND.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// If both a and b are not \"\" (null string), the output is 1. Otherwise 0.\npublic struct OpBoolAnd: OpCodeProtocol {\n    public var value: UInt8 { return 0x9a }\n    public var name: String { return \"OP_BOOLAND\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = context.data(at: -2)\n        let x2 = context.data(at: -1)\n        let output: Bool = x1 != Data() && x2 != Data()\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(output)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_BOOLOR.swift",
    "content": "//\n//  OP_BOOLOR.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// If a or b is not \"\" (null string), the output is 1. Otherwise 0.\npublic struct OpBoolOr: OpCodeProtocol {\n    public var value: UInt8 { return 0x9b }\n    public var name: String { return \"OP_BOOLOR\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = context.data(at: -2)\n        let x2 = context.data(at: -1)\n        let output: Bool = x1 != Data() || x2 != Data()\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(output)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_DIV.swift",
    "content": "//\n//  OP_DIV.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x/y)\npublic struct OpDiv: OpCodeProtocol {\n    public var value: UInt8 { return 0x96 }\n    public var name: String { return \"OP_DIV\" }\n\n    // (x1 x2 -- out)\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        // denominator must not be 0\n        guard x2 != 0 else {\n            throw OpCodeExecutionError.error(\"Division by zero error\")\n        }\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 / x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_GREATERTHAN.swift",
    "content": "//\n//  OP_GREATERTHAN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if x1 is greater than x2, 0 otherwise.\npublic struct OpGreaterThan: OpCodeProtocol {\n    public var value: UInt8 { return 0xa0 }\n    public var name: String { return \"OP_GREATERTHAN\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(x1 > x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_GREATERTHANOREQUAL.swift",
    "content": "//\n//  OP_GREATERTHANOREQUAL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if x1 is greater than or equal to x2, 0 otherwise.\npublic struct OpGreaterThanOrEqual: OpCodeProtocol {\n    public var value: UInt8 { return 0xa2 }\n    public var name: String { return \"OP_GREATERTHANOREQUAL\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(x1 >= x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_LESSTHAN.swift",
    "content": "//\n//  OP_LESSTHAN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if x1 is less than x2, 0 otherwise.\npublic struct OpLessThan: OpCodeProtocol {\n    public var value: UInt8 { return 0x9f }\n    public var name: String { return \"OP_LESSTHAN\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(x1 < x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_LESSTHANOREQUAL.swift",
    "content": "//\n//  OP_LESSTHANOREQUAL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if x1 is less than or equal to x2, 0 otherwise.\npublic struct OpLessThanOrEqual: OpCodeProtocol {\n    public var value: UInt8 { return 0xa1 }\n    public var name: String { return \"OP_LESSTHANOREQUAL\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(x1 <= x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_LSHIFT.swift",
    "content": "//\n//  OP_LSHIFT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x<<y) disabled.\npublic struct OpLShift: OpCodeProtocol {\n    public var value: UInt8 { return 0x98 }\n    public var name: String { return \"OP_LSHIFT\" }\n\n    public func isEnabled() -> Bool {\n        return false\n    }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 << x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_MAX.swift",
    "content": "//\n//  OP_MAX.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Returns the larger of a and b.\npublic struct OpMax: OpCodeProtocol {\n    public var value: UInt8 { return 0xa4 }\n    public var name: String { return \"OP_MAX\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(max(x1, x2))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_MIN.swift",
    "content": "//\n//  OP_MIN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Returns the smaller of a and b.\npublic struct OpMin: OpCodeProtocol {\n    public var value: UInt8 { return 0xa3 }\n    public var name: String { return \"OP_MIN\" }\n\n    // (x1 x2 -- out)\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(min(x1, x2))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_MOD.swift",
    "content": "//\n//  OP_MOD.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x%y)\npublic struct OpMod: OpCodeProtocol {\n    public var value: UInt8 { return 0x97 }\n    public var name: String { return \"OP_MOD\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        // denominator must not be 0\n        guard x2 != 0 else {\n            throw OpCodeExecutionError.error(\"Modulo by zero error\")\n        }\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 % x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_MUL.swift",
    "content": "//\n//  OP_MUL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x*y) disabled\npublic struct OpMul: OpCodeProtocol {\n    public var value: UInt8 { return 0x95 }\n    public var name: String { return \"OP_MUL\" }\n\n    public func isEnabled() -> Bool {\n        return false\n    }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 * x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_NEGATE.swift",
    "content": "//\n//  OP_NEGATE.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// negates the number, pops it from stack and pushes result.\npublic struct OpNegate: OpCodeProtocol {\n    public var value: UInt8 { return 0x8f }\n    public var name: String { return \"OP_NEGATE\" }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        try context.pushToStack(-input)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_NOT.swift",
    "content": "//\n//  OP_NOT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// replaces number with True if it's zero, False otherwise.\npublic struct OpNot: OpCodeProtocol {\n    public var value: UInt8 { return 0x91 }\n    public var name: String { return \"OP_NOT\" }\n\n    // (in -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let input = try context.number(at: -1)\n        context.stack.removeLast()\n        context.pushToStack(input == 0)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_NUMEQUAL.swift",
    "content": "//\n//  OP_NUMEQUAL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if the numbers are equal, 0 otherwise.\npublic struct OpNumEqual: OpCodeProtocol {\n    public var value: UInt8 { return 0x9c }\n    public var name: String { return \"OP_NUMEQUAL\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(x1 == x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_NUMEQUALVERIFY.swift",
    "content": "//\n//  OP_NUMEQUALVERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Same as OP_NUMEQUAL, but runs OP_VERIFY afterward.\npublic struct OpNumEqualVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0x9d }\n    public var name: String { return \"OP_NUMEQUALVERIFY\" }\n\n    // input : x1 x2\n    // output : - / fail\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try OpCode.OP_NUMEQUAL.mainProcess(context)\n        do {\n            try OpCode.OP_VERIFY.mainProcess(context)\n        } catch {\n            throw OpCodeExecutionError.error(\"OP_NUMEQUALVERIFY failed.\")\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_NUMNOTEQUAL.swift",
    "content": "//\n//  OP_NUMNOTEQUAL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if the numbers are not equal, 0 otherwise.\npublic struct OpNumNotEqual: OpCodeProtocol {\n    public var value: UInt8 { return 0xe }\n    public var name: String { return \"OP_NUMNOTEQUAL\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(x1 != x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_RSHIFT.swift",
    "content": "//\n//  OP_RSHIFT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x>>y) disabled.\npublic struct OpRShift: OpCodeProtocol {\n    public var value: UInt8 { return 0x99 }\n    public var name: String { return \"OP_RSHIFT\" }\n\n    public func isEnabled() -> Bool {\n        return false\n    }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 >> x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_SUB.swift",
    "content": "//\n//  OP_SUB.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// (x y -- x-y)\npublic struct OpSub: OpCodeProtocol {\n    public var value: UInt8 { return 0x94 }\n    public var name: String { return \"OP_SUB\" }\n\n    // (x1 x2 -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = try context.number(at: -2)\n        let x2 = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        try context.pushToStack(x1 - x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Arithmetic/OP_WITHIN.swift",
    "content": "//\n//  OP_WITHIN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\nimport Foundation\n\n// Returns 1 if x is within the specified range (left-inclusive), 0 otherwise.\npublic struct OpWithin: OpCodeProtocol {\n    public var value: UInt8 { return 0xa5 }\n    public var name: String { return \"OP_WITHIN\" }\n\n    // (x1 min max -- out)\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(3)\n\n        let x = try context.number(at: -3)\n        let minValue = try context.number(at: -2)\n        let maxValue = try context.number(at: -1)\n\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.pushToStack(minValue <= x && x < maxValue)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_AND.swift",
    "content": "//\n//  OP_AND.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Boolean AND between each bit of the inputs\npublic struct OpAnd: OpCodeProtocol {\n    public var value: UInt8 { return 0x84 }\n    public var name: String { return \"OP_AND\" }\n\n    // input : x1 x2\n    // output : out\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x2 = context.stack.removeLast()\n        let x1 = context.stack.removeLast()\n\n        // Inputs must be the same size\n        guard x1.count == x2.count else {\n            throw OpCodeExecutionError.error(\"Invalid operand size\")\n        }\n\n        let count: Int = x1.count\n        var output = Data(count: count)\n        for i in 0..<count {\n            output[i] = x1[i] & x2[i]\n        }\n        context.stack.append(output)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_EQUAL.swift",
    "content": "//\n//  OP_EQUAL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Returns 1 if the inputs are exactly equal, 0 otherwise.\npublic struct OpEqual: OpCodeProtocol {\n    public var value: UInt8 { return 0x87 }\n    public var name: String { return \"OP_EQUAL\" }\n\n    // input : x1 x2\n    // output : true / false\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x1 = context.stack.popLast()!\n        let x2 = context.stack.popLast()!\n        let equal: Bool = x1 == x2\n        context.pushToStack(equal)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_EQUALVERIFY.swift",
    "content": "//\n//  OP_EQUALVERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Same as OP_EQUAL, but runs OP_VERIFY afterward.\npublic struct OpEqualVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0x88 }\n    public var name: String { return \"OP_EQUALVERIFY\" }\n\n    // input : x1 x2\n    // output : - / fail\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try OpCode.OP_EQUAL.mainProcess(context)\n        do {\n            try OpCode.OP_VERIFY.mainProcess(context)\n        } catch {\n            throw OpCodeExecutionError.error(\"OP_EQUALVERIFY failed.\")\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_INVERT.swift",
    "content": "//\n//  OP_INVERT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Flips all of the bits in the input. disabled.\npublic struct OpInvert: OpCodeProtocol {\n    public var value: UInt8 { return 0x83 }\n    public var name: String { return \"OP_INVERT\" }\n\n    public func isEnabled() -> Bool {\n        return false\n    }\n\n    // input : in\n    // output : out\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let x = context.stack.removeLast()\n        let output: Data = Data(from: x.map { ~$0 })\n        context.stack.append(output)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_OR.swift",
    "content": "//\n//  OP_OR.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Boolean OR between each bit of the inputs\npublic struct OpOr: OpCodeProtocol {\n    public var value: UInt8 { return 0x85 }\n    public var name: String { return \"OP_OR\" }\n\n    // input : x1 x2\n    // output : out\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x2 = context.stack.removeLast()\n        let x1 = context.stack.removeLast()\n\n        // Inputs must be the same size\n        guard x1.count == x2.count else {\n            throw OpCodeExecutionError.error(\"Invalid operand size\")\n        }\n\n        let count: Int = x1.count\n        var output = Data(count: count)\n        for i in 0..<count {\n            output[i] = x1[i] | x2[i]\n        }\n        context.stack.append(output)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_RESERVED1.swift",
    "content": "//\n//  OP_RESERVED1.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct OpReserved1: OpCodeProtocol {\n    public var value: UInt8 { return 0x89 }\n    public var name: String { return \"OP_RESERVED1\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"\\(name) should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_RESERVED2.swift",
    "content": "//\n//  OP_RESERVED2.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct OpReserved2: OpCodeProtocol {\n    public var value: UInt8 { return 0x8a }\n    public var name: String { return \"OP_RESERVED2\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"\\(name) should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Bitwise Logic/OP_XOR.swift",
    "content": "//\n//  OP_XOR.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Boolean EXCLUSIVE OR between each bit of the inputs\npublic struct OpXor: OpCodeProtocol {\n    public var value: UInt8 { return 0x86 }\n    public var name: String { return \"OP_XOR\" }\n\n    // input : x1 x2\n    // output : out\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let x2 = context.stack.removeLast()\n        let x1 = context.stack.removeLast()\n\n        // Inputs must be the same size\n        guard x1.count == x2.count else {\n            throw OpCodeExecutionError.error(\"Invalid operand size\")\n        }\n\n        let count: Int = x1.count\n        var output = Data(count: count)\n        for i in 0..<count {\n            output[i] = x1[i] ^ x2[i]\n        }\n        context.stack.append(output)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_CHECKMULTISIG.swift",
    "content": "//\n//  OP_CHECKMULTISIG.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Compares the first signature against each public key until it finds an ECDSA match. Starting\n// with the subsequent public key, it compares the second signature against each remaining public key\n// until it finds an ECDSA match. The process is repeated until all signatures have been checked or not\n// enough public keys remain to produce a successful result. All signatures need to match a public key.\n// Because public keys are not checked again if they fail any signature comparison, signatures must be\n// placed in the scriptSig using the same order as their corresponding public keys were placed in the\n// scriptPubKey or redeemScript. If all signatures are valid, 1 is returned, 0 otherwise. Due to a bug,\n// one extra unused value is removed from the stack.\npublic struct OpCheckMultiSig: OpCodeProtocol {\n    public var value: UInt8 { return 0xae }\n    public var name: String { return \"OP_CHECKMULTISIG\" }\n\n    // input : x sig1 sig2 ... <number of signatures> pub1 pub2 <number of public keys>\n    // output : true / false\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n\n        // Get numPublicKeys with validation\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        let numPublicKeys = Int(try context.number(at: -1))\n        guard numPublicKeys >= 0 && numPublicKeys <= BTC_MAX_KEYS_FOR_CHECKMULTISIG else {\n            throw OpCodeExecutionError.error(\"Invalid number of keys for \\(name): \\(numPublicKeys).\")\n        }\n        try context.incrementOpCount(by: numPublicKeys)\n        context.stack.removeLast()\n\n        // Get pubkeys with validation\n        var publicKeys: [Data] = []\n        try context.assertStackHeightGreaterThanOrEqual(numPublicKeys)\n        for _ in 0..<numPublicKeys {\n            publicKeys.append(context.stack.removeLast())\n        }\n\n        // Get numgSis with validation\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        let numSigs = Int(try context.number(at: -1))\n        guard numSigs >= 0 && numSigs <= numPublicKeys else {\n            throw OpCodeExecutionError.error(\"Invalid number of signatures for \\(name): \\(numSigs).\")\n        }\n        context.stack.removeLast()\n\n        // Get sigs with validation\n        var signatures: [Data] = []\n        try context.assertStackHeightGreaterThanOrEqual(numSigs)\n        for _ in 0..<numSigs {\n            signatures.append(context.stack.removeLast())\n        }\n\n        // Remove extra opcode (OP_0)\n        // Due to a bug, one extra unused value is removed from the stack.\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        context.stack.removeLast()\n\n        // Signatures must come in the same order as their keys.\n        var success: Bool = true\n        var firstSigError: Error?\n        guard let tx = context.transaction, let utxo = context.utxoToVerify else {\n            throw OpCodeExecutionError.error(\"The transaction or the utxo to verify is not set.\")\n        }\n        while success && !signatures.isEmpty {\n            let pubkeyData: Data = publicKeys.removeFirst()\n            let sigData: Data = signatures[0]\n            do {\n                let valid = try Crypto.verifySigData(for: tx, inputIndex: Int(context.inputIndex), utxo: utxo, sigData: sigData, pubKeyData: pubkeyData)\n                if valid {\n                    signatures.removeFirst()\n                }\n            } catch let error {\n                if firstSigError == nil {\n                    firstSigError = error\n                }\n            }\n\n            // If there are more signatures left than keys left,\n            // then too many signatures have failed\n            if publicKeys.count < signatures.count {\n                success = false\n            }\n        }\n        context.pushToStack(success)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_CHECKMULTISIGVERIFY.swift",
    "content": "//\n//  OP_CHECKMULTISIGVERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Same as OP_CHECKMULTISIG, but OP_VERIFY is executed afterward.\npublic struct OpCheckMultiSigVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0xaf }\n    public var name: String { return \"OP_CHECKMULTISIGVERIFY\" }\n\n    // input : x sig1 sig2 ... <number of signatures> pub1 pub2 <number of public keys>\n    // output : Nothing / fail\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try OpCode.OP_CHECKMULTISIG.mainProcess(context)\n        do {\n            try OpCode.OP_VERIFY.mainProcess(context)\n        } catch {\n            throw OpCodeExecutionError.error(\"OP_CHECKMULTISIGVERIFY failed.\")\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_CHECKSIG.swift",
    "content": "//\n//  OP_CHECKSIG.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The entire transaction's outputs, inputs, and script (from the most recently-executed OP_CODESEPARATOR to the end) are hashed. The signature used by OP_CHECKSIG must be a valid signature for this hash and public key. If it is, 1 is returned, 0 otherwise.\npublic struct OpCheckSig: OpCodeProtocol {\n    public var value: UInt8 { return 0xac }\n    public var name: String { return \"OP_CHECKSIG\" }\n\n    // input : sig pubkey\n    // output : true / false\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n\n        let pubkeyData: Data = context.stack.removeLast()\n        let sigData: Data = context.stack.removeLast()\n\n        guard let tx = context.transaction, let utxo = context.utxoToVerify else {\n            throw OpCodeExecutionError.error(\"The transaction or the utxo to verify is not set.\")\n        }\n        let valid = try Crypto.verifySigData(for: tx, inputIndex: Int(context.inputIndex), utxo: utxo, sigData: sigData, pubKeyData: pubkeyData)\n        context.pushToStack(valid)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_CHECKSIGVERIFY.swift",
    "content": "//\n//  OP_CHECKSIGVERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Same as OP_CHECKSIG, but OP_VERIFY is executed afterward.\npublic struct OpCheckSigVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0xad }\n    public var name: String { return \"OP_CHECKSIGVERIFY\" }\n\n    // input : sig pubkey\n    // output : Nothing / fail\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try OpCode.OP_CHECKSIG.mainProcess(context)\n        do {\n            try OpCode.OP_VERIFY.mainProcess(context)\n        } catch {\n            throw OpCodeExecutionError.error(\"OP_CHECKSIGVERIFY failed.\")\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_CODESEPARATOR.swift",
    "content": "//\n//  OP_CODESEPARATOR.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/09.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\n// All of the signature checking words will only match signatures to the data after the most recently-executed OP_CODESEPARATOR.\npublic struct OpCodeSeparator: OpCodeProtocol {\n    public var value: UInt8 { return 0xab }\n    public var name: String { return \"OP_CODESEPARATOR\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_HASH160.swift",
    "content": "//\n//  OP_HASH160.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The input is hashed twice: first with SHA-256 and then with RIPEMD-160.\npublic struct OpHash160: OpCodeProtocol {\n    public var value: UInt8 { return 0xa9 }\n    public var name: String { return \"OP_HASH160\" }\n\n    // input : in\n    // output : hash\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let data: Data = context.stack.removeLast()\n        let hash = RIPEMD160.hash(data.sha256())\n        context.stack.append(hash)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_HASH256.swift",
    "content": "//\n//  OP_HASH256.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/09.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\n// The input is hashed two times with SHA-256.\npublic struct OpHash256: OpCodeProtocol {\n    public var value: UInt8 { return 0xaa }\n    public var name: String { return \"OP_HASH256\" }\n\n    // input : in\n    // output : hash\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let data: Data = context.stack.removeLast()\n        let hash: Data = data.doubleSHA256\n        context.stack.append(hash)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_RIPEMD160.swift",
    "content": "//\n//  OP_RIPEMD160.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/09.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\n// The input is hashed using RIPEMD-160.\npublic struct OpRipemd160: OpCodeProtocol {\n    public var value: UInt8 { return 0xa6 }\n    public var name: String { return \"OP_RIPEMD160\" }\n\n    // input : in\n    // output : hash\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let data: Data = context.stack.removeLast()\n        let hash: Data = RIPEMD160.hash(data)\n        context.stack.append(hash)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_SHA1.swift",
    "content": "//\n//  OP_SHA1.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/09.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\nimport CryptoSwift\n\n// The input is hashed using SHA-1.\npublic struct OpSha1: OpCodeProtocol {\n    public var value: UInt8 { return 0xa7 }\n    public var name: String { return \"OP_SHA1\" }\n\n    // input : in\n    // output : hash\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let data: Data = context.stack.removeLast()\n        let hash: Data = data.sha1()\n        context.stack.append(hash)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Crypto/OP_SHA256.swift",
    "content": "//\n//  OP_SHA256.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/09.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\n// The input is hashed using SHA-256.\npublic struct OpSha256: OpCodeProtocol {\n    public var value: UInt8 { return 0xa8 }\n    public var name: String { return \"OP_SHA256\" }\n\n    // input : in\n    // output : hash\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        let data: Data = context.stack.removeLast()\n         let hash: Data = data.sha256()\n        context.stack.append(hash)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_ELSE.swift",
    "content": "//\n//  OP_ELSE.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\npublic struct OpElse: OpCodeProtocol {\n    public var value: UInt8 { return 0x67 }\n    public var name: String { return \"OP_ELSE\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        guard !context.conditionStack.isEmpty else {\n            throw OpCodeExecutionError.error(\"Expected an OP_IF or OP_NOTIF branch before OP_ELSE.\")\n        }\n        let f = context.conditionStack.removeLast()\n        context.conditionStack.append(!f)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_ENDIF.swift",
    "content": "//\n//  OP_ENDIF.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\npublic struct OpEndIf: OpCodeProtocol {\n    public var value: UInt8 { return 0x68 }\n    public var name: String { return \"OP_ENDIF\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        guard !context.conditionStack.isEmpty else {\n            throw OpCodeExecutionError.error(\"Expected an OP_IF or OP_NOTIF branch before OP_ENDIF.\")\n        }\n        context.conditionStack.removeLast()\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_IF.swift",
    "content": "//\n//  OP_IF.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\npublic struct OpIf: OpCodeProtocol {\n    public var value: UInt8 { return 0x63 }\n    public var name: String { return \"OP_IF\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        var value: Bool = false\n        if context.shouldExecute {\n            try context.assertStackHeightGreaterThanOrEqual(1)\n            value = context.bool(at: -1)\n            context.stack.removeLast()\n        }\n        context.conditionStack.append(value)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_NOP.swift",
    "content": "//\n//  OP_NOP.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\n// do nothing\npublic struct OpNop: OpCodeProtocol {\n    public var value: UInt8 { return 0x61 }\n    public var name: String { return \"OP_NOP\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_NOTIF.swift",
    "content": "//\n//  OP_NOTIF.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\npublic struct OpNotIf: OpCodeProtocol {\n    public var value: UInt8 { return 0x64 }\n    public var name: String { return \"OP_NOTIF\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        var value: Bool = false\n        if context.shouldExecute {\n            try context.assertStackHeightGreaterThanOrEqual(1)\n            value = context.bool(at: -1)\n            context.stack.removeLast()\n        }\n        context.conditionStack.append(!value)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_RETURN.swift",
    "content": "//\n//  OP_RETURN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct OpReturn: OpCodeProtocol {\n    public var value: UInt8 { return 0x6a }\n    public var name: String { return \"OP_RETURN\" }\n\n     public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_RETURN was encountered\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_VER.swift",
    "content": "//\n//  OP_VER.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\npublic struct OpVer: OpCodeProtocol {\n    public var value: UInt8 { return 0x62 }\n    public var name: String { return \"OP_VER\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_VER should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_VERIF.swift",
    "content": "//\n//  OP_VERIF.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\n// Transaction is invalid unless occuring in an unexecuted OP_IF branch\npublic struct OpVerIf: OpCodeProtocol {\n    public var value: UInt8 { return 0x65 }\n    public var name: String { return \"OP_VERIF\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_VERIF should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_VERIFY.swift",
    "content": "//\n//  OP_VERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Marks transaction as invalid if top stack value is not true. The top stack value is removed.\npublic struct OpVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0x69 }\n    public var name: String { return \"OP_VERIFY\" }\n\n    // input : true / false\n    // output : - / fail\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        guard context.bool(at: -1) else {\n            throw OpCodeExecutionError.error(\"OP_VERIFY failed.\")\n        }\n        context.stack.removeLast()\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Flow Control/OP_VERNOTIF.swift",
    "content": "//\n//  OP_VERNOTIF.swift\n//  BitcoinKit\n//\n//  Created by Shun Usami on 2018/08/08.\n//  Copyright © 2018 BitcoinKit developers. All rights reserved.\n//\n\nimport Foundation\n\npublic struct OpVerNotIf: OpCodeProtocol {\n    public var value: UInt8 { return 0x66 }\n    public var name: String { return \"OP_VERNOTIF\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_VERNOTIF should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Lock Time/OP_CHECKLOCKTIMEVERIFY.swift",
    "content": "//\n//  OP_CHECKLOCKTIMEVERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Marks transaction as invalid if the top stack item is greater than the transaction's nLockTime field, otherwise script evaluation continues as though an OP_NOP was executed. Transaction is also invalid if\n// 1. the stack is empty; or\n// 2. the top stack item is negative; or\n// 3. the top stack item is greater than or equal to 500000000 while the transaction's nLockTime field is less than 500000000, or vice versa; or\n// 4. the input's nSequence field is equal to 0xffffffff.\n// The precise semantics are described in BIP 0065.\npublic struct OpCheckLockTimeVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0xb1 }\n    public var name: String { return \"OP_CHECKLOCKTIMEVERIFY \" }\n\n    // input : x\n    // output : x / fail\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        // nLockTime should be Int5\n        // reference: https://github.com/Bitcoin-ABC/bitcoin-abc/blob/73c5e7532e19b8f35fcf73255cd1d0df67607cd2/src/script/interpreter.cpp#L420\n        let nLockTime = try context.number(at: -1)\n        guard nLockTime >= 0 else {\n            throw OpCodeExecutionError.error(\"NEGATIVE_LOCKTIME\")\n        }\n\n        // checker.CheckLockTime(nLockTime)\n        guard let tx = context.transaction, let txin = context.txinToVerify else {\n            throw OpCodeExecutionError.error(\"OP_CHECKLOCKTIMEVERIFY must have a transaction in context.\")\n        }\n\n        // There are two kinds of nLockTime: lock-by-blockheight and lock-by-blocktime, distinguished by whether nLockTime < LOCKTIME_THRESHOLD.\n        //\n        // We want to compare apples to apples, so fail the script unless the type of nLockTime being tested is the same as the nLockTime in the transaction.\n        guard (tx.lockTime < BTC_LOCKTIME_THRESHOLD && nLockTime < BTC_LOCKTIME_THRESHOLD) ||\n            (tx.lockTime >= BTC_LOCKTIME_THRESHOLD && nLockTime >= BTC_LOCKTIME_THRESHOLD) else {\n            throw OpCodeExecutionError.error(\"tx.lockTime and nLockTime should be the same kind.\")\n        }\n\n        guard nLockTime <= tx.lockTime  else {\n            throw OpCodeExecutionError.error(\"The top stack item is greater than the transaction's nLockTime field\")\n        }\n\n        // Finally the nLockTime feature can be disabled and thus\n        // CHECKLOCKTIMEVERIFY bypassed if every txin has been finalized by setting\n        // nSequence to maxint. The transaction would be allowed into the\n        // blockchain, making the opcode ineffective.\n        //\n        // Testing if this vin is not final is sufficient to prevent this condition.\n        // Alternatively we could test all inputs, but testing just this input\n        // minimizes the data required to prove correct CHECKLOCKTIMEVERIFY\n        // execution.\n        let SEQUENCE_FINAL: UInt32 = 0xffffffff\n        guard txin.sequence != SEQUENCE_FINAL else {\n            throw OpCodeExecutionError.error(\"The input's nSequence field is equal to 0xffffffff.\")\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Lock Time/OP_CHECKSEQUENCEVERIFY.swift",
    "content": "//\n//  OP_CHECKSEQUENCEVERIFY.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Marks transaction as invalid if the relative lock time of the input (enforced by BIP 0068 with nSequence) is not equal to or longer than the value of the top stack item. The precise semantics are described in BIP 0112.\npublic struct OpCheckSequenceVerify: OpCodeProtocol {\n    public var value: UInt8 { return 0xb2 }\n    public var name: String { return \"OP_CHECKSEQUENCEVERIFY\" }\n\n    // input : x\n    // output : x / fail\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n\n        // nLockTime should be Int5\n        // reference: https://github.com/Bitcoin-ABC/bitcoin-abc/blob/73c5e7532e19b8f35fcf73255cd1d0df67607cd2/src/script/interpreter.cpp#L420\n        let nSequenceTmp = try context.number(at: -1)\n        guard nSequenceTmp >= 0 else {\n            throw OpCodeExecutionError.error(\"NEGATIVE_LOCKTIME\")\n        }\n        let nSequence: UInt32 = UInt32(nSequenceTmp)\n\n        guard let tx = context.transaction, let txin = context.txinToVerify else {\n            throw OpCodeExecutionError.error(\"OP_CHECKLOCKTIMEVERIFY must have a transaction in context.\")\n        }\n\n        let txToSequence = txin.sequence\n        guard tx.version > 1 else {\n            throw OpCodeExecutionError.error(\"Transaction's version number is not set high enough to trigger BIP 68 rules.\")\n        }\n\n        let SEQUENCE_LOCKTIME_DISABLE_FLAG: UInt32 = (1 << 31)\n        guard txToSequence & SEQUENCE_LOCKTIME_DISABLE_FLAG == 0 else {\n            throw OpCodeExecutionError.error(\"SEQUENCE_LOCKTIME_DISABLE_FLAG is set.\")\n        }\n\n        let SEQUENCE_LOCKTIME_TYPE_FLAG: UInt32 = (1 << 22)\n        let SEQUENCE_LOCKTIME_MASK: UInt32 = 0x0000ffff\n        let nLockTimeMask: UInt32 = SEQUENCE_LOCKTIME_TYPE_FLAG | SEQUENCE_LOCKTIME_MASK\n        let txToSequenceMasked: UInt32 = txToSequence & nLockTimeMask\n        let nSequenceMasked: UInt32 = nSequence & nLockTimeMask\n\n        guard (txToSequenceMasked < SEQUENCE_LOCKTIME_TYPE_FLAG && nSequenceMasked < SEQUENCE_LOCKTIME_TYPE_FLAG) ||\n            (txToSequenceMasked >= SEQUENCE_LOCKTIME_TYPE_FLAG && nSequenceMasked >= SEQUENCE_LOCKTIME_TYPE_FLAG) else {\n                throw OpCodeExecutionError.error(\"txToSequenceMasked and nSequenceMasked should be the same kind.\")\n        }\n\n        guard nSequence <= txToSequenceMasked  else {\n            throw OpCodeExecutionError.error(\"The top stack item is greater than the transaction's nSequence field\")\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/OP_EXAMPLE.swift",
    "content": "//\n//  OP_EXAMPLE.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the “Software”), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// This class should be removed when all OP_CODEs are implemented\npublic class OpExample: OpCodeProtocol {\n    public var value: UInt8 { return 0x00 }\n    public var name: String { return \"OP_EXAMPLE\" }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Pseudo Words/OP_INVALIDOPCODE.swift",
    "content": "//\n//  OP_INVALIDOPCODE.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct OpInvalidOpCode: OpCodeProtocol {\n    public var value: UInt8 { return 0xff }\n    public var name: String { return \"OP_INVALIDOPCODE\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_INVALIDOPCODE should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Pseudo Words/OP_PUBKEY.swift",
    "content": "//\n//  OP_PUBKEY.swift\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Represents a public key hashed with OP_HASH160.\n// This used internally for assisting with transaction matching. They are invalid if used in actual scripts.\npublic struct OpPubkey: OpCodeProtocol {\n    public var value: UInt8 { return 0xfe }\n    public var name: String { return \"OP_PUBKEY\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_PUBKEY should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Pseudo Words/OP_PUBKEYHASH.swift",
    "content": "//\n//  OP_PUBKEYHASH.swift\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Represents a public key compatible with OP_CHECKSIG.\n// This used internally for assisting with transaction matching. They are invalid if used in actual scripts.\npublic struct OpPubkeyHash: OpCodeProtocol {\n    public var value: UInt8 { return 0xfd }\n    public var name: String { return \"OP_PUBKEYHASH\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"OP_PUBKEYHASH should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Push Data/OP_0.swift",
    "content": "//\n//  OP_0.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// An empty array of bytes is pushed onto the stack.\n// This is not a no-op, but is PUSHDATA op: an item is added to the stack.\n//\npublic struct Op0: OpCodeProtocol {\n    public var value: UInt8 { return 0x00 }\n    public var name: String { return \"OP_0\" }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Push Data/OP_1NEGATE.swift",
    "content": "//\n//  OP_1NEGATE.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The number -1 is pushed onto the stack.\npublic struct Op1Negate: OpCodeProtocol {\n    public var value: UInt8 { return 0x4f }\n    public var name: String { return \"OP_1NEGATE\" }\n    // input : -\n    // output : -1\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.pushToStack(-1)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Push Data/OP_N.swift",
    "content": "//\n//  OP_N.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The number in the word name (1-16) is pushed onto the stack.\npublic struct OpN: OpCodeProtocol {\n    public var value: UInt8 { return 0x50 + n }\n    public var name: String { return \"OP_\\(n)\" }\n    private let n: UInt8\n    internal init(_ n: UInt8) {\n        guard (1...16).contains(n) else {\n            fatalError(\"OP_N can be initialized with N between 1 and 16. \\(n) is not valid.\")\n        }\n        self.n = n\n    }\n\n    // input : -\n    // output : n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.pushToStack(Int32(n))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Push Data/OP_PUSHDATA.swift",
    "content": "//\n//  OP_PUSHDATA.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n// Any opcode with value < PUSHDATA1 is a length of the string to be pushed on the stack.\n// So opcode 0x01 is followed by 1 byte of data, 0x09 by 9 bytes and so on up to 0x4b (75 bytes)\n// PUSHDATA<N> opcode is followed by N-byte length of the string that follows.\n\n// The next 1-byte contains the number of bytes to be pushed onto the stack (allows pushing 0..255 bytes).\npublic struct OpPushData1: OpCodeProtocol {\n    public var value: UInt8 { return 0x4c }\n    public var name: String { return \"OP_PUSHDATA1\" }\n}\n\n// The next 2-bytes contain the number of bytes to be pushed onto the stack in little endian order (allows pushing 0..65535 bytes).\npublic struct OpPushData2: OpCodeProtocol {\n    public var value: UInt8 { return 0x4d }\n    public var name: String { return \"OP_PUSHDATA2\" }\n}\n\n// The next 4-bytes contain the number of bytes to be pushed onto the stack in little endian order (allows pushing 0..4294967295 bytes)\npublic struct OpPushData4: OpCodeProtocol {\n    public var value: UInt8 { return 0x4e }\n    public var name: String { return \"OP_PUSHDATA4\" }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Push Data/OP_RESERVED.swift",
    "content": "//\n//  OP_RESERVED.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct OpReserved: OpCodeProtocol {\n    public var value: UInt8 { return 0x50 }\n    public var name: String { return \"OP_RESERVED\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.error(\"\\(name) should not be executed.\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Reserved Words/OP_NOPN.swift",
    "content": "//\n//  OP_NOPN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct OpNop1: OpCodeProtocol {\n    public var value: UInt8 { return 0xb0 }\n    public var name: String { return \"OP_NOP1\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop4: OpCodeProtocol {\n    public var value: UInt8 { return 0xb3 }\n    public var name: String { return \"OP_NOP4\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop5: OpCodeProtocol {\n    public var value: UInt8 { return 0xb4 }\n    public var name: String { return \"OP_NOP5\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop6: OpCodeProtocol {\n    public var value: UInt8 { return 0xb5 }\n    public var name: String { return \"OP_NOP6\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop7: OpCodeProtocol {\n    public var value: UInt8 { return 0xb6 }\n    public var name: String { return \"OP_NOP8\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop8: OpCodeProtocol {\n    public var value: UInt8 { return 0xb7 }\n    public var name: String { return \"OP_NOP8\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop9: OpCodeProtocol {\n    public var value: UInt8 { return 0xb8 }\n    public var name: String { return \"OP_NOP9\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n\npublic struct OpNop10: OpCodeProtocol {\n    public var value: UInt8 { return 0xb9 }\n    public var name: String { return \"OP_NOP10\" }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        // do nothing\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Splice/OP_BIN2NUM.swift",
    "content": "//\n//  OP_BIN2NUM.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// convert byte sequence x into a numeric value\npublic struct OpBin2Num: OpCodeProtocol {\n    public var value: UInt8 { return 0x81 }\n    public var name: String { return \"OP_BIN2NUM\" }\n\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Splice/OP_CAT.swift",
    "content": "//\n//  OP_CAT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Concatenates two strings.\npublic struct OpConcatenate: OpCodeProtocol {\n    public var value: UInt8 { return 0x7e }\n    public var name: String { return \"OP_CAT\" }\n\n    // input : x1 x2\n    // output : out\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let x1: Data = context.data(at: -2)\n        let x2: Data = context.data(at: -1)\n        guard x1.count + x2.count <= BTC_MAX_SCRIPT_ELEMENT_SIZE else {\n            throw OpCodeExecutionError.error(\"Push value size limit exceeded\")\n        }\n        context.stack.removeLast()\n        context.stack.removeLast()\n        context.stack.append(x1 + x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Splice/OP_NUM2BIN.swift",
    "content": "//\n//  OP_NUM2BIN.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// convert numeric value a into byte sequence of length b\npublic struct OpNum2Bin: OpCodeProtocol {\n    public var value: UInt8 { return 0x80 }\n    public var name: String { return \"OP_NUM2BIN\" }\n\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Splice/OP_SIZE.swift",
    "content": "//\n//  OP_SIZE.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Pushes the string length of the top element of the stack (without popping it).\npublic struct OpSize: OpCodeProtocol {\n    public var value: UInt8 { return 0x82 }\n    public var name: String { return \"OP_SIZE\" }\n\n    // input : in\n    // output : in size\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        let x: Data = context.data(at: -1)\n        try context.pushToStack(Int32(x.count))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Splice/OP_SPLIT.swift",
    "content": "//\n//  OP_SPLIT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Split the operand at the given position.\npublic struct OpSplit: OpCodeProtocol {\n    public var value: UInt8 { return 0x7f }\n    public var name: String { return \"OP_SPLIT\" }\n\n    // input : in position\n    // output : x1 x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let data: Data = context.data(at: -2)\n\n        // Make sure the split point is apropriate.\n        let position: Int32 = try context.number(at: -1)\n        guard position <= data.count else {\n            throw OpCodeExecutionError.error(\"Invalid OP_SPLIT range\")\n        }\n\n        let n1: Data = data.subdata(in: 0..<Int(position))\n        let n2: Data = data.subdata(in: Int(position)..<data.count)\n\n        // Replace existing stack values by the new values.\n        context.stack[context.stack.count - 2] = n1\n        context.stack[context.stack.count - 1] = n2\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_2DROP.swift",
    "content": "//\n//  OP_2DROP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Removes the top two stack items.\npublic struct Op2Drop: OpCodeProtocol {\n    public var value: UInt8 { return 0x6d }\n    public var name: String { return \"OP_2DROP\" }\n\n    // input : x1 x2\n    // output : Nothing\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        context.stack.removeLast()\n        context.stack.removeLast()\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_2DUP.swift",
    "content": "//\n//  OP_2DUP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Duplicates the top two stack items.\npublic struct Op2Duplicate: OpCodeProtocol {\n    public var value: UInt8 { return 0x6e }\n    public var name: String { return \"OP_2DUP\" }\n\n    // input : x1 x2\n    // output : x1 x2 x1 x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let x1: Data = context.data(at: -2)\n        let x2: Data = context.data(at: -1)\n        try context.pushToStack(x1)\n        try context.pushToStack(x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_2OVER.swift",
    "content": "//\n//  OP_2OVER.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Copies the pair of items two spaces back in the stack to the front.\npublic struct Op2Over: OpCodeProtocol {\n    public var value: UInt8 { return 0x70 }\n    public var name: String { return \"OP_2OVER\" }\n\n    // input : x1 x2 x3 x4\n    // output : x1 x2 x3 x4 x1 x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(4)\n        let x1: Data = context.data(at: -4)\n        let x2: Data = context.data(at: -3)\n        context.stack.append(x1)\n        context.stack.append(x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_2ROT.swift",
    "content": "//\n//  OP_2ROT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The fifth and sixth items back are moved to the top of the stack.\npublic struct Op2Rot: OpCodeProtocol {\n    public var value: UInt8 { return 0x7b }\n    public var name: String { return \"OP_2ROT\" }\n\n    // input : x1 x2 x3 x4 x5 x6\n    // output : x3 x4 x5 x6 x1 x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(6)\n        let x1: Data = context.data(at: -6)\n        let x2: Data = context.data(at: -5)\n        let count: Int = context.stack.count\n        context.stack.removeSubrange(count - 6 ..< count - 4)\n        context.stack.append(x1)\n        context.stack.append(x2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_2SWAP.swift",
    "content": "//\n//  OP_2SWAP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Swaps the top two pairs of items.\npublic struct Op2Swap: OpCodeProtocol {\n    public var value: UInt8 { return 0x72 }\n    public var name: String { return \"OP_2SWAP\" }\n\n    // input : x1 x2 x3 x4\n    // output : x3 x4 x1 x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(4)\n        context.swapDataAt(i: -4, j: -2)\n        context.swapDataAt(i: -3, j: -1)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_3DUP.swift",
    "content": "//\n//  OP_3DUP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Duplicates the top three stack items.\npublic struct Op3Duplicate: OpCodeProtocol {\n    public var value: UInt8 { return 0x6f }\n    public var name: String { return \"OP_3DUP\" }\n\n    // input : x1 x2 x3\n    // output : x1 x2 x3 x1 x2 x3\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(3)\n        let x1: Data = context.data(at: -3)\n        let x2: Data = context.data(at: -2)\n        let x3: Data = context.data(at: -1)\n        try context.pushToStack(x1)\n        try context.pushToStack(x2)\n        try context.pushToStack(x3)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_DEPTH.swift",
    "content": "//\n//  OP_DEPTH.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Puts the number of stack items onto the stack.\npublic struct OpDepth: OpCodeProtocol {\n    public var value: UInt8 { return 0x74 }\n    public var name: String { return \"OP_DEPTH\" }\n\n    // input : Nothing\n    // output : <Stack size>\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        let count: Int = context.stack.count\n        try context.pushToStack(Int32(count))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_DROP.swift",
    "content": "//\n//  OP_DROP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Removes the top stack item.\npublic struct OpDrop: OpCodeProtocol {\n    public var value: UInt8 { return 0x75 }\n    public var name: String { return \"OP_DROP\" }\n\n    // input : x\n    // output : Nothing\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        context.stack.removeLast()\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_DUP.swift",
    "content": "//\n//  OP_DUP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Duplicates the top stack item.\npublic struct OpDuplicate: OpCodeProtocol {\n    public var value: UInt8 { return 0x76 }\n    public var name: String { return \"OP_DUP\" }\n\n    // input : x\n    // output : x x\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        let x: Data = context.data(at: -1)\n        try context.pushToStack(x)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_FROMALTSTACK.swift",
    "content": "//\n//  OP_FROMALTSTACK.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Puts the input onto the top of the main stack. Removes it from the alt stack.\npublic struct OpFromAltStack: OpCodeProtocol {\n    public var value: UInt8 { return 0x6c }\n    public var name: String { return \"OP_FROMALTSTACK\" }\n\n    // input : (alt)x\n    // output : x\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertAltStackHeightGreaterThanOrEqual(1)\n        let x: Data = context.altStack.removeLast()\n        context.stack.append(x)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_IFDUP.swift",
    "content": "//\n//  OP_IFDUP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// If the top stack value is not 0, duplicate it.\npublic struct OpIfDup: OpCodeProtocol {\n    public var value: UInt8 { return 0x73 }\n    public var name: String { return \"OP_IFDUP\" }\n\n    // input : x\n    // output : x / x x    \n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        if context.bool(at: -1) {\n            context.stack.append(context.data(at: -1))\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_NIP.swift",
    "content": "//\n//  OP_NIP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Removes the second-to-top stack item.\npublic struct OpNip: OpCodeProtocol {\n    public var value: UInt8 { return 0x77 }\n    public var name: String { return \"OP_NIP\" }\n\n    // input : x1 x2\n    // output : x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let count: Int = context.stack.count\n        context.stack.remove(at: count - 2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_OVER.swift",
    "content": "//\n//  OP_OVER.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Copies the second-to-top stack item to the top.\npublic struct OpOver: OpCodeProtocol {\n    public var value: UInt8 { return 0x78 }\n    public var name: String { return \"OP_OVER\" }\n\n    // input : x1 x2\n    // output : x1 x2 x1\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let x: Data = context.data(at: -2)\n        context.stack.append(x)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_PICK.swift",
    "content": "//\n//  OP_PICK.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The item n back in the stack is copied to the top.\npublic struct OpPick: OpCodeProtocol {\n    public var value: UInt8 { return 0x79 }\n    public var name: String { return \"OP_PICK\" }\n\n    // input : xn ... x2 x1 x0 <n>\n    // output : xn ... x2 x1 x0 xn\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let n: Int32 = try context.number(at: -1)\n        context.stack.removeLast()\n        guard n >= 0 else {\n            throw OpCodeExecutionError.error(\"\\(name): n should be greater than or equal to 0.\")\n        }\n        let index: Int = Int(n + 1)\n        try context.assertStackHeightGreaterThanOrEqual(index)\n        let xn: Data = context.data(at: -index)\n        context.stack.append(xn)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_ROLL.swift",
    "content": "//\n//  OP_ROLL.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The item n back in the stack is moved to the top.\npublic struct OpRoll: OpCodeProtocol {\n    public var value: UInt8 { return 0x7a }\n    public var name: String { return \"OP_ROLL\" }\n\n    // input : xn ... x2 x1 x0 <n>\n    // output : ... x2 x1 x0 xn\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let n: Int32 = try context.number(at: -1)\n        context.stack.removeLast()\n        guard n >= 0 else {\n            throw OpCodeExecutionError.error(\"\\(name): n should be greater than or equal to 0.\")\n        }\n        let index: Int = Int(n + 1)\n        try context.assertStackHeightGreaterThanOrEqual(index)\n        let count: Int = context.stack.count\n        let xn: Data = context.stack.remove(at: count - index)\n        context.stack.append(xn)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_ROT.swift",
    "content": "//\n//  OP_ROT.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The top three items on the stack are rotated to the left.\npublic struct OpRot: OpCodeProtocol {\n    public var value: UInt8 { return 0x7b }\n    public var name: String { return \"OP_ROT\" }\n\n    // input : x1 x2 x3\n    // output : x2 x3 x1\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(3)\n        context.swapDataAt(i: -3, j: -2)\n        context.swapDataAt(i: -2, j: -1)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_SWAP.swift",
    "content": "//\n//  OP_SWAP.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The top two items on the stack are swapped.\npublic struct OpSwap: OpCodeProtocol {\n    public var value: UInt8 { return 0x7c }\n    public var name: String { return \"OP_SWAP\" }\n\n    // input : x1 x2\n    // output : x2 x1\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        context.swapDataAt(i: -2, j: -1)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_TOTALSTACK.swift",
    "content": "//\n//  OP_TOALTSTACK.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// Puts the input onto the top of the alt stack. Removes it from the main stack.\npublic struct OpToAltStack: OpCodeProtocol {\n    public var value: UInt8 { return 0x6b }\n    public var name: String { return \"OP_TOALTSTACK\" }\n\n    // input : x\n    // output : (alt)x\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(1)\n        let x: Data = context.stack.removeLast()\n        context.altStack.append(x)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OP_CODE/Stack/OP_TUCK.swift",
    "content": "//\n//  OP_TUCK.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n// The item at the top of the stack is copied and inserted before the second-to-top item.\npublic struct OpTuck: OpCodeProtocol {\n    public var value: UInt8 { return 0x7d }\n    public var name: String { return \"OP_TUCK\" }\n\n    // input : x1 x2\n    // output : x2 x1 x2\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try context.assertStackHeightGreaterThanOrEqual(2)\n        let x: Data = context.data(at: -1)\n        let count: Int = context.stack.count\n        context.stack.insert(x, at: count - 2)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OpCodeFactory.swift",
    "content": "//\n//  OpCodeFactory.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\n/**\n This struct represents a factory that creates OpCodes from integers or strings.\n */\npublic struct OpCodeFactory {\n\n    /**\n     Returns the OpCode which a given UInt8 value.\n     Returns OP_INVALIDOPCODE for outranged value.\n     \n     - parameter value: UInt8 value corresponding to the OpCode\n     \n     - returns: The OpCode corresponding to value\n    */\n    public static func get(with value: UInt8) -> OpCode {\n        guard let item = (OpCode.list.first { $0.value == value }) else {\n            return .OP_INVALIDOPCODE\n        }\n        return item\n    }\n\n    /**\n     Returns the OpCode which a given name.\n     Returns OP_INVALIDOPCODE for unknown names.\n     \n     - parameter name: String corresponding to the OpCode\n     \n     - returns: The OpCode corresponding to name\n     */\n    public static func get(with name: String) -> OpCode {\n        guard let item = (OpCode.list.first { $0.name == name }) else {\n            return .OP_INVALIDOPCODE\n        }\n        return item\n    }\n\n    /**\n     Returns OP_1NEGATE, OP_0 .. OP_16 for ints from -1 to 16.\n     Returns OP_INVALIDOPCODE for other ints.\n     \n     - parameter smallInteger: Int value from -1 to 16\n \n     - returns: The OpCode corresponding to smallInteger\n    */\n    public typealias SmallInteger = Int\n    public static func opcode(for smallInteger: SmallInteger) -> OpCode {\n        switch smallInteger {\n        case -1:\n            return .OP_1NEGATE\n        case 0:\n            return .OP_0\n        case 1...16:\n            return get(with: OpCode.OP_1.value + UInt8(smallInteger - 1))\n        default:\n            return .OP_INVALIDOPCODE\n        }\n    }\n\n    /**\n     Converts opcode OP_<N> or OP_1NEGATE to an Int value.\n     If incorrect opcode is given, Int.max is returned.\n     \n     - parameter opcode: OpCode which can be OP_<N> or OP_1NEGATE\n     \n     - returns: Int value correspondint to OpCode\n    */\n    public static func smallInteger(from opcode: OpCode) -> SmallInteger {\n        switch opcode {\n        case .OP_1NEGATE:\n            return -1\n        case .OP_0:\n            return 0\n        case (OpCode.OP_1)...(OpCode.OP_16):\n            return Int(opcode.value - OpCode.OP_1.value + 1)\n        default:\n            return Int.max\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/OpCodeProtocol.swift",
    "content": "//\n//  OpCodeProtocol.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic protocol OpCodeProtocol {\n    var name: String { get }\n    var value: UInt8 { get }\n\n    func isEnabled() -> Bool\n    func mainProcess(_ context: ScriptExecutionContext) throws\n}\n\nextension OpCodeProtocol {\n    public func isEnabled() -> Bool {\n        return true\n    }\n    private func preprocess(_ context: ScriptExecutionContext) throws {\n        if value > OpCode.OP_16 {\n            try context.incrementOpCount()\n        }\n\n        guard isEnabled() else {\n            throw OpCodeExecutionError.disabled\n        }\n\n        guard !(context.shouldExecute && 0 <= value && value <= OpCode.OP_PUSHDATA4.value) else {\n            throw OpCodeExecutionError.error(\"PUSHDATA OP_CODE should not be executed.\")\n        }\n    }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        throw OpCodeExecutionError.notImplemented(\"[\\(name)(\\(value))]\")\n    }\n\n    public func execute(_ context: ScriptExecutionContext) throws {\n        try preprocess(context)\n        guard context.shouldExecute || (OpCode.OP_IF <= self && self <= OpCode.OP_ENDIF) else {\n            if context.verbose {\n                print(\"[SKIP execution :  \\(name)(\\(value))]\\n\" + String(repeating: \"-\", count: 100))\n            }\n            return\n        }\n        if context.verbose {\n            print(\"OpCount : \\(context.opCount)\\n[pre execution : \\(name)(\\(value))]\\n\\(context)\")\n        }\n\n        try mainProcess(context)\n\n        if context.verbose {\n            print(\"[post execution : \\(name)(\\(value))]\\n\\(context)\\n\" + String(repeating: \"-\", count: 100))\n        }\n    }\n}\n\npublic enum OpCodeExecutionError: Error {\n    case notImplemented(String)\n    case error(String)\n    case opcodeRequiresItemsOnStack(Int)\n    case invalidBignum\n    case disabled\n}\n\n// ==\npublic func == (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Bool {\n    return lhs.value == rhs.value\n}\npublic func == <Other: BinaryInteger>(lhs: OpCodeProtocol, rhs: Other) -> Bool {\n    return lhs.value == rhs\n}\npublic func == <Other: BinaryInteger>(lhs: Other, rhs: OpCodeProtocol) -> Bool {\n    return lhs == rhs.value\n}\n\n// !=\npublic func != (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Bool {\n    return lhs.value != rhs.value\n}\npublic func != <Other: BinaryInteger>(lhs: OpCodeProtocol, rhs: Other) -> Bool {\n    return lhs.value != rhs\n}\npublic func != <Other: BinaryInteger>(lhs: Other, rhs: OpCodeProtocol) -> Bool {\n    return lhs != rhs.value\n}\n\n// >\npublic func > (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Bool {\n    return lhs.value > rhs.value\n}\npublic func > <Other: BinaryInteger>(lhs: OpCodeProtocol, rhs: Other) -> Bool {\n    return lhs.value > rhs\n}\npublic func > <Other: BinaryInteger>(lhs: Other, rhs: OpCodeProtocol) -> Bool {\n    return lhs > rhs.value\n}\n\n// <\npublic func < (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Bool {\n    return lhs.value < rhs.value\n}\npublic func < <Other: BinaryInteger>(lhs: OpCodeProtocol, rhs: Other) -> Bool {\n    return lhs.value < rhs\n}\npublic func < <Other: BinaryInteger>(lhs: Other, rhs: OpCodeProtocol) -> Bool {\n    return lhs < rhs.value\n}\n\n// >=\npublic func >= (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Bool {\n    return lhs.value >= rhs.value\n}\n\n// <=\npublic func <= (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Bool {\n    return lhs.value <= rhs.value\n}\n\n// ...\npublic func ... (lhs: OpCodeProtocol, rhs: OpCodeProtocol) -> Range<UInt8> {\n    return Range(lhs.value...rhs.value)\n}\n\n// ~=\npublic func ~= (pattern: OpCodeProtocol, op: OpCodeProtocol) -> Bool {\n    return pattern == op\n}\npublic func ~= (pattern: Range<UInt8>, op: OpCodeProtocol) -> Bool {\n    return pattern ~= op.value\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/Opcode.swift",
    "content": "//\n//  OpCode.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic enum OpCode: OpCodeProtocol {\n    // swiftlint:disable:next line_length\n    case OP_0, OP_FALSE, OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4, OP_1NEGATE, OP_RESERVED, OP_1, OP_TRUE, OP_2, OP_3, OP_4, OP_5, OP_6, OP_7, OP_8, OP_9, OP_10, OP_11, OP_12, OP_13, OP_14, OP_15, OP_16, OP_NOP, OP_VER, OP_IF, OP_NOTIF, OP_VERIF, OP_VERNOTIF, OP_ELSE, OP_ENDIF, OP_VERIFY, OP_RETURN, OP_TOALTSTACK, OP_FROMALTSTACK, OP_2DROP, OP_2DUP, OP_3DUP, OP_2OVER, OP_2ROT, OP_2SWAP, OP_IFDUP, OP_DEPTH, OP_DROP, OP_DUP, OP_NIP, OP_OVER, OP_PICK, OP_ROLL, OP_ROT, OP_SWAP, OP_TUCK, OP_CAT, OP_SIZE, OP_SPLIT, OP_NUM2BIN, OP_BIN2NUM, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_EQUAL, OP_EQUALVERIFY, OP_RESERVED1, OP_RESERVED2, OP_1ADD, OP_1SUB, OP_2MUL, OP_2DIV, OP_NEGATE, OP_ABS, OP_NOT, OP_0NOTEQUAL, OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT, OP_RSHIFT, OP_BOOLAND, OP_BOOLOR, OP_NUMEQUAL, OP_NUMEQUALVERIFY, OP_NUMNOTEQUAL, OP_LESSTHAN, OP_GREATERTHAN, OP_LESSTHANOREQUAL, OP_GREATERTHANOREQUAL, OP_MIN, OP_MAX, OP_WITHIN, OP_RIPEMD160, OP_SHA1, OP_SHA256, OP_HASH160, OP_HASH256, OP_CODESEPARATOR, OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY, OP_CHECKLOCKTIMEVERIFY, OP_CHECKSEQUENCEVERIFY, OP_PUBKEYHASH, OP_PUBKEY, OP_INVALIDOPCODE, OP_NOP1, OP_NOP4, OP_NOP5, OP_NOP6, OP_NOP7, OP_NOP8, OP_NOP9, OP_NOP10\n\n    private var opcode: OpCodeProtocol {\n        switch self {\n        // 1. Operators pushing data on stack.\n        case .OP_0: return Op0()\n        case .OP_FALSE: return OpCode.OP_0.opcode\n        case .OP_PUSHDATA1: return OpPushData1()\n        case .OP_PUSHDATA2: return OpPushData2()\n        case .OP_PUSHDATA4: return OpPushData4()\n        case .OP_1NEGATE: return Op1Negate()\n        case .OP_RESERVED: return OpReserved() // reserved and fail if executed\n        case .OP_1: return OpN(1)\n        case .OP_TRUE: return OpCode.OP_1.opcode\n        case .OP_2: return OpN(2)\n        case .OP_3: return OpN(3)\n        case .OP_4: return OpN(4)\n        case .OP_5: return OpN(5)\n        case .OP_6: return OpN(6)\n        case .OP_7: return OpN(7)\n        case .OP_8: return OpN(8)\n        case .OP_9: return OpN(9)\n        case .OP_10: return OpN(10)\n        case .OP_11: return OpN(11)\n        case .OP_12: return OpN(12)\n        case .OP_13: return OpN(13)\n        case .OP_14: return OpN(14)\n        case .OP_15: return OpN(15)\n        case .OP_16: return OpN(16)\n\n        // 2. Flow Control operators\n        case .OP_NOP: return OpNop()\n        case .OP_VER: return OpVer()\n        case .OP_IF: return OpIf()\n        case .OP_NOTIF: return OpNotIf()\n        case .OP_VERIF: return OpVerIf()\n        case .OP_VERNOTIF: return OpVerNotIf()\n        case .OP_ELSE: return OpElse()\n        case .OP_ENDIF: return OpEndIf()\n        case .OP_VERIFY: return OpVerify()\n        case .OP_RETURN: return OpReturn()\n\n        // 3. Stack ops\n        case .OP_TOALTSTACK: return OpToAltStack()\n        case .OP_FROMALTSTACK: return OpFromAltStack()\n        case .OP_2DROP: return Op2Drop()\n        case .OP_2DUP: return Op2Duplicate()\n        case .OP_3DUP: return Op3Duplicate()\n        case .OP_2OVER: return Op2Over()\n        case .OP_2ROT: return Op2Rot()\n        case .OP_2SWAP: return Op2Swap()\n        case .OP_IFDUP: return OpIfDup()\n        case .OP_DEPTH: return OpDepth()\n        case .OP_DROP: return OpDrop()\n        case .OP_DUP: return OpDuplicate()\n        case .OP_NIP: return OpNip()\n        case .OP_OVER: return OpOver()\n        case .OP_PICK: return OpPick()\n        case .OP_ROLL: return OpRoll()\n        case .OP_ROT: return OpRot()\n        case .OP_SWAP: return OpSwap()\n        case .OP_TUCK: return OpTuck()\n\n        // 4. Splice ops\n        case .OP_CAT: return OpConcatenate()\n        case .OP_SIZE: return OpSize()\n        case .OP_SPLIT: return OpSplit()\n        case .OP_NUM2BIN: return OpExample()\n        case .OP_BIN2NUM: return OpExample()\n\n        // 5. Bitwise logic\n        case .OP_INVERT: return OpInvert()\n        case .OP_AND: return OpAnd()\n        case .OP_OR: return OpOr()\n        case .OP_XOR: return OpXor()\n        case .OP_EQUAL: return OpEqual()\n        case .OP_EQUALVERIFY: return OpEqualVerify()\n        case .OP_RESERVED1: return OpReserved1() // reserved and fail if executed\n        case .OP_RESERVED2: return OpReserved2() // reserved and fail if executed\n\n        // 6. Arithmetic\n        case .OP_1ADD: return Op1Add()\n        case .OP_1SUB: return Op1Sub()\n        case .OP_2MUL: return Op2Mul()\n        case .OP_2DIV: return Op2Div()\n        case .OP_NEGATE: return OpNegate()\n        case .OP_ABS: return OpAbsolute()\n        case .OP_NOT: return OpNot()\n        case .OP_0NOTEQUAL: return OP0NotEqual()\n        case .OP_ADD: return OpAdd()\n        case .OP_SUB: return OpSub()\n        case .OP_MUL: return OpMul()\n        case .OP_DIV: return OpDiv()\n        case .OP_MOD: return OpMod()\n        case .OP_LSHIFT: return OpLShift()\n        case .OP_RSHIFT: return OpRShift()\n        case .OP_BOOLAND: return OpBoolAnd()\n        case .OP_BOOLOR: return OpBoolOr()\n        case .OP_NUMEQUAL: return OpNumEqual()\n        case .OP_NUMEQUALVERIFY: return OpNumEqualVerify()\n        case .OP_NUMNOTEQUAL: return OpNumNotEqual()\n        case .OP_LESSTHAN: return OpLessThan()\n        case .OP_GREATERTHAN: return OpGreaterThan()\n        case .OP_LESSTHANOREQUAL: return OpLessThanOrEqual()\n        case .OP_GREATERTHANOREQUAL: return OpGreaterThanOrEqual()\n        case .OP_MIN: return OpMin()\n        case .OP_MAX: return OpMax()\n        case .OP_WITHIN: return OpWithin()\n\n        // Crypto\n        case .OP_RIPEMD160: return OpRipemd160()\n        case .OP_SHA1: return OpSha1()\n        case .OP_SHA256: return OpSha256()\n        case .OP_HASH160: return OpHash160()\n        case .OP_HASH256: return OpHash256()\n        case .OP_CODESEPARATOR: return OpCodeSeparator()\n        case .OP_CHECKSIG: return OpCheckSig()\n        case .OP_CHECKSIGVERIFY: return OpCheckSigVerify()\n        case .OP_CHECKMULTISIG: return OpCheckMultiSig()\n        case .OP_CHECKMULTISIGVERIFY: return OpCheckMultiSigVerify()\n\n        // Lock Times\n        case .OP_CHECKLOCKTIMEVERIFY: return OpCheckLockTimeVerify() // previously OP_NOP2\n        case .OP_CHECKSEQUENCEVERIFY: return OpCheckSequenceVerify() // previously OP_NOP3\n\n        // Pseudo Words\n        case .OP_PUBKEYHASH: return OpPubkeyHash()\n        case .OP_PUBKEY: return OpPubkey()\n        case .OP_INVALIDOPCODE: return OpInvalidOpCode()\n\n        // Reserved Words\n        case .OP_NOP1: return OpNop1()\n        case .OP_NOP4: return OpNop4()\n        case .OP_NOP5: return OpNop5()\n        case .OP_NOP6: return OpNop6()\n        case .OP_NOP7: return OpNop7()\n        case .OP_NOP8: return OpNop8()\n        case .OP_NOP9: return OpNop9()\n        case .OP_NOP10: return OpNop10()\n        }\n    }\n\n    // swiftlint:disable:next line_length\n    internal static let list: [OpCode] = [OP_0, OP_FALSE, OP_PUSHDATA1, OP_PUSHDATA2, OP_PUSHDATA4, OP_1NEGATE, OP_RESERVED, OP_1, OP_TRUE, OP_2, OP_3, OP_4, OP_5, OP_6, OP_7, OP_8, OP_9, OP_10, OP_11, OP_12, OP_13, OP_14, OP_15, OP_16, OP_NOP, OP_VER, OP_IF, OP_NOTIF, OP_VERIF, OP_VERNOTIF, OP_ELSE, OP_ENDIF, OP_VERIFY, OP_RETURN, OP_TOALTSTACK, OP_FROMALTSTACK, OP_2DROP, OP_2DUP, OP_3DUP, OP_2OVER, OP_2ROT, OP_2SWAP, OP_IFDUP, OP_DEPTH, OP_DROP, OP_DUP, OP_NIP, OP_OVER, OP_PICK, OP_ROLL, OP_ROT, OP_SWAP, OP_TUCK, OP_CAT, OP_SIZE, OP_SPLIT, OP_NUM2BIN, OP_INVERT, OP_AND, OP_OR, OP_XOR, OP_EQUAL, OP_EQUALVERIFY, OP_RESERVED1, OP_RESERVED2, OP_BIN2NUM, OP_1ADD, OP_1SUB, OP_2MUL, OP_2DIV, OP_NEGATE, OP_ABS, OP_NOT, OP_0NOTEQUAL, OP_ADD, OP_SUB, OP_MUL, OP_DIV, OP_MOD, OP_LSHIFT, OP_RSHIFT, OP_BOOLAND, OP_BOOLOR, OP_NUMEQUAL, OP_NUMEQUALVERIFY, OP_NUMNOTEQUAL, OP_LESSTHAN, OP_GREATERTHAN, OP_LESSTHANOREQUAL, OP_GREATERTHANOREQUAL, OP_MIN, OP_MAX, OP_WITHIN, OP_RIPEMD160, OP_SHA1, OP_SHA256, OP_HASH160, OP_HASH256, OP_CODESEPARATOR, OP_CHECKSIG, OP_CHECKSIGVERIFY, OP_CHECKMULTISIG, OP_CHECKMULTISIGVERIFY, OP_CHECKLOCKTIMEVERIFY, OP_CHECKSEQUENCEVERIFY, OP_PUBKEYHASH, OP_PUBKEY, OP_INVALIDOPCODE, OP_NOP1, OP_NOP4, OP_NOP5, OP_NOP6, OP_NOP7, OP_NOP8, OP_NOP9, OP_NOP10]\n\n    public var name: String {\n        return opcode.name\n    }\n\n    public var value: UInt8 {\n        return opcode.value\n    }\n\n    public func isEnabled() -> Bool {\n        return opcode.isEnabled()\n    }\n\n    public func mainProcess(_ context: ScriptExecutionContext) throws {\n        try opcode.mainProcess(context)\n    }\n}\n\n//public struct OpCode {\n//    // 1. Operators pushing data on stack.\n//\n//    // Push 1 byte 0x00 on the stack\n//    public static let OP_0: OpCodeProtocol = Op0()\n//    public static let OP_FALSE = OP_0\n//\n//    // Any opcode with value < PUSHDATA1 is a length of the string to be pushed on the stack.\n//    // So opcode 0x01 is followed by 1 byte of data, 0x09 by 9 bytes and so on up to 0x4b (75 bytes)\n//\n//    // PUSHDATA<N> opcode is followed by N-byte length of the string that follows.\n//    public static let OP_PUSHDATA1: OpCodeProtocol = OpPushData1() // followed by a 1-byte length of the string to push (allows pushing 0..255 bytes).\n//    public static let OP_PUSHDATA2: OpCodeProtocol = OpPushData2() // followed by a 2-byte length of the string to push (allows pushing 0..65535 bytes).\n//    public static let OP_PUSHDATA4: OpCodeProtocol = OpPushData4() // followed by a 4-byte length of the string to push (allows pushing 0..4294967295 bytes).\n//    public static let OP_1NEGATE: OpCodeProtocol = Op1Negate() // pushes -1 number on the stack\n//    public static let OP_RESERVED: OpCodeProtocol = OpExample() // Not assigned. If executed, transaction is invalid.\n//\n//    // public static let OP_<N> pushes number <N> on the stack\n//    public static let OP_1: OpCodeProtocol = OpN(1)\n//    public static let OP_TRUE = OP_1\n//    public static let OP_2: OpCodeProtocol = OpN(2)\n//    public static let OP_3: OpCodeProtocol = OpN(3)\n//    public static let OP_4: OpCodeProtocol = OpN(4)\n//    public static let OP_5: OpCodeProtocol = OpN(5)\n//    public static let OP_6: OpCodeProtocol = OpN(6)\n//    public static let OP_7: OpCodeProtocol = OpN(7)\n//    public static let OP_8: OpCodeProtocol = OpN(8)\n//    public static let OP_9: OpCodeProtocol = OpN(9)\n//    public static let OP_10: OpCodeProtocol = OpN(10)\n//    public static let OP_11: OpCodeProtocol = OpN(11)\n//    public static let OP_12: OpCodeProtocol = OpN(12)\n//    public static let OP_13: OpCodeProtocol = OpN(13)\n//    public static let OP_14: OpCodeProtocol = OpN(14)\n//    public static let OP_15: OpCodeProtocol = OpN(15)\n//    public static let OP_16: OpCodeProtocol = OpN(16)\n//\n//    // 2. Control flow operators\n//\n//    public static let OP_NOP: OpCodeProtocol = OpExample() // Does nothing\n//    public static let OP_VER: OpCodeProtocol = OpExample() // Not assigned. If executed, transaction is invalid.\n//\n//    // BitcoinQT executes all operators from public static let OP_IF to public static let OP_ENDIF even inside \"non-executed\" branch (to keep track of nesting).\n//    // Since public static let OP_VERIF and public static let OP_VERNOTIF are not assigned, even inside a non-executed branch they will fall in \"default:\" switch case\n//    // and cause the script to fail. Some other ops like public static let OP_VER can be present inside non-executed branch because they'll be skipped.\n//    public static let OP_IF: OpCodeProtocol = OpExample() // If the top stack value is not 0, the statements are executed. The top stack value is removed.\n//    public static let OP_NOTIF: OpCodeProtocol = OpExample() // If the top stack value is 0, the statements are executed. The top stack value is removed.\n//    public static let OP_VERIF: OpCodeProtocol = OpExample() // Not assigned. Script is invalid with that opcode (even if inside non-executed branch).\n//    public static let OP_VERNOTIF: OpCodeProtocol = OpExample() // Not assigned. Script is invalid with that opcode (even if inside non-executed branch).\n//    public static let OP_ELSE: OpCodeProtocol = OpExample() // Executes code if the previous public static let OP_IF or public static let OP_NOTIF was not executed.\n//    public static let OP_ENDIF: OpCodeProtocol = OpExample() // Finishes if/else block\n//\n//    public static let OP_VERIFY: OpCodeProtocol = OpVerify() // Removes item from the stack if it's not 0x00 or 0x80 (negative zero). Otherwise, marks script as invalid.\n//    public static let OP_RETURN: OpCodeProtocol = OpReturn() // Marks transaction as invalid.\n//\n//    // Stack ops\n//    public static let OP_TOALTSTACK: OpCodeProtocol = OpExample() // Moves item from the stack to altstack\n//    public static let OP_FROMALTSTACK: OpCodeProtocol = OpExample() // Moves item from the altstack to stack\n//    public static let OP_2DROP: OpCodeProtocol = OpExample()\n//    public static let OP_2DUP: OpCodeProtocol = OpExample()\n//    public static let OP_3DUP: OpCodeProtocol = OpExample()\n//    public static let OP_2OVER: OpCodeProtocol = OpExample()\n//    public static let OP_2ROT: OpCodeProtocol = OpExample()\n//    public static let OP_2SWAP: OpCodeProtocol = OpExample()\n//    public static let OP_IFDUP: OpCodeProtocol = OpExample()\n//    public static let OP_DEPTH: OpCodeProtocol = OpExample()\n//    public static let OP_DROP: OpCodeProtocol = OpExample()\n//    public static let OP_DUP: OpCodeProtocol = OpDuplicate()\n//    public static let OP_NIP: OpCodeProtocol = OpExample()\n//    public static let OP_OVER: OpCodeProtocol = OpExample()\n//    public static let OP_PICK: OpCodeProtocol = OpExample()\n//    public static let OP_ROLL: OpCodeProtocol = OpExample()\n//    public static let OP_ROT: OpCodeProtocol = OpExample()\n//    public static let OP_SWAP: OpCodeProtocol = OpSwap()\n//    public static let OP_TUCK: OpCodeProtocol = OpExample()\n//\n//    // Splice ops\n//    public static let OP_CAT: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_SUBSTR: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_LEFT: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_RIGHT: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_SIZE: OpCodeProtocol = OpExample()\n//\n//    // Bit logic\n//    public static let OP_INVERT: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_AND: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_OR: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_XOR: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//\n//    public static let OP_EQUAL: OpCodeProtocol = OpEqual()       // Last two items are removed from the stack and compared. Result (true or false) is pushed to the stack.\n//    public static let OP_EQUALVERIFY: OpCodeProtocol = OpEqualVerify() // Same as public static let OP_EQUAL, but removes the result from the stack if it's true or marks script as invalid.\n//\n//    public static let OP_RESERVED1: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_RESERVED2: OpCodeProtocol = OpExample() // Disabled opcode. If executed, transaction is invalid.\n//\n//    // Numeric\n//    public static let OP_1ADD: OpCodeProtocol = Op1Add() // adds 1 to last item, pops it from stack and pushes result.\n//    public static let OP_1SUB: OpCodeProtocol = Op1Sub() // substracts 1 to last item, pops it from stack and pushes result.\n//    public static let OP_2MUL: OpCodeProtocol = Op2Mul() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_2DIV: OpCodeProtocol = Op2Div() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_NEGATE: OpCodeProtocol = OpNegate() // negates the number, pops it from stack and pushes result.\n//    public static let OP_ABS: OpCodeProtocol = OpAbsolute() // replaces number with its absolute value\n//    public static let OP_NOT: OpCodeProtocol = OpNot() // replaces number with True if it's zero, False otherwise.\n//    public static let OP_0NOTEQUAL: OpCodeProtocol = OP0NotEqual() // replaces number with True if it's not zero, False otherwise.\n//    public static let OP_ADD: OpCodeProtocol = OpAdd() // (x y -- x+y)\n//    public static let OP_SUB: OpCodeProtocol = OpSub() // (x y -- x-y)\n//    public static let OP_MUL: OpCodeProtocol = OpMul() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_DIV: OpCodeProtocol = OpDiv() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_MOD: OpCodeProtocol = OpMod() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_LSHIFT: OpCodeProtocol = OpLShift() // Disabled opcode. If executed, transaction is invalid.\n//    public static let OP_RSHIFT: OpCodeProtocol = OpRShift() // Disabled opcode. If executed, transaction is invalid.\n//\n//    public static let OP_BOOLAND: OpCodeProtocol = OpBoolAnd()\n//    public static let OP_BOOLOR: OpCodeProtocol = OpBoolOr()\n//    public static let OP_NUMEQUAL: OpCodeProtocol = OpNumEqual()\n//    public static let OP_NUMEQUALVERIFY: OpCodeProtocol = OpNumEqualVerify()\n//    public static let OP_NUMNOTEQUAL: OpCodeProtocol = OpNumNotEqual()\n//    public static let OP_LESSTHAN: OpCodeProtocol = OpLessThan()\n//    public static let OP_GREATERTHAN: OpCodeProtocol = OpGreaterThan()\n//    public static let OP_LESSTHANOREQUAL: OpCodeProtocol = OpLessThanOrEqual()\n//    public static let OP_GREATERTHANOREQUAL: OpCodeProtocol = OpGreaterThanOrEqual()\n//    public static let OP_MIN: OpCodeProtocol = OpMin()\n//    public static let OP_MAX: OpCodeProtocol = OpMax()\n//\n//    public static let OP_WITHIN: OpCodeProtocol = OpWithin()\n//\n//    // Crypto\n//    public static let OP_RIPEMD160: OpCodeProtocol = OpExample()\n//    public static let OP_SHA1: OpCodeProtocol = OpExample()\n//    public static let OP_SHA256: OpCodeProtocol = OpExample()\n//    public static let OP_HASH160: OpCodeProtocol = OpHash160()\n//    public static let OP_HASH256: OpCodeProtocol = OpExample()\n//    public static let OP_CODESEPARATOR: OpCodeProtocol = OpExample() // This opcode is rarely used because it's useless, but we need to support it anyway.\n//    public static let OP_CHECKSIG: OpCodeProtocol = OpCheckSig()\n//    public static let OP_CHECKSIGVERIFY: OpCodeProtocol = OpCheckSigVerify()\n//    public static let OP_CHECKMULTISIG: OpCodeProtocol = OpCheckMultiSig()\n//    public static let OP_CHECKMULTISIGVERIFY: OpCodeProtocol = OpCheckMultiSigVerify()\n//\n//    // Expansion\n//    public static let OP_NOP1: OpCodeProtocol = OpExample()\n//    public static let OP_NOP2: OpCodeProtocol = OpExample()\n//    public static let OP_NOP3: OpCodeProtocol = OpExample()\n//    public static let OP_NOP4: OpCodeProtocol = OpExample()\n//    public static let OP_NOP5: OpCodeProtocol = OpExample()\n//    public static let OP_NOP6: OpCodeProtocol = OpExample()\n//    public static let OP_NOP7: OpCodeProtocol = OpExample()\n//    public static let OP_NOP8: OpCodeProtocol = OpExample()\n//    public static let OP_NOP9: OpCodeProtocol = OpExample()\n//    public static let OP_NOP10: OpCodeProtocol = OpExample()\n//\n//    public static let OP_INVALIDOPCODE: OpCodeProtocol = OpInvalidOpCode()\n//\n//    internal static let list: [OpCodeProtocol] = [\n//        OP_0,\n//        OP_FALSE,\n//        OP_PUSHDATA1,\n//        OP_PUSHDATA2,\n//        OP_PUSHDATA4,\n//        OP_1NEGATE,\n//        OP_RESERVED,\n//        OP_1,\n//        OP_TRUE,\n//        OP_2,\n//        OP_3,\n//        OP_4,\n//        OP_5,\n//        OP_6,\n//        OP_7,\n//        OP_8,\n//        OP_9,\n//        OP_10,\n//        OP_11,\n//        OP_12,\n//        OP_13,\n//        OP_14,\n//        OP_15,\n//        OP_16,\n//        OP_NOP,\n//        OP_VER,\n//        OP_IF,\n//        OP_NOTIF,\n//        OP_VERIF,\n//        OP_VERNOTIF,\n//        OP_ELSE,\n//        OP_ENDIF,\n//        OP_VERIFY,\n//        OP_RETURN,\n//        OP_TOALTSTACK,\n//        OP_FROMALTSTACK,\n//        OP_2DROP,\n//        OP_2DUP,\n//        OP_3DUP,\n//        OP_2OVER,\n//        OP_2ROT,\n//        OP_2SWAP,\n//        OP_IFDUP,\n//        OP_DEPTH,\n//        OP_DROP,\n//        OP_DUP,\n//        OP_NIP,\n//        OP_OVER,\n//        OP_PICK,\n//        OP_ROLL,\n//        OP_ROT,\n//        OP_SWAP,\n//        OP_TUCK,\n//        OP_CAT,\n//        OP_SUBSTR,\n//        OP_LEFT,\n//        OP_RIGHT,\n//        OP_SIZE,\n//        OP_INVERT,\n//        OP_AND,\n//        OP_OR,\n//        OP_XOR,\n//        OP_EQUAL,\n//        OP_EQUALVERIFY,\n//        OP_RESERVED1,\n//        OP_RESERVED2,\n//        OP_1ADD,\n//        OP_1SUB,\n//        OP_2MUL,\n//        OP_2DIV,\n//        OP_NEGATE,\n//        OP_ABS,\n//        OP_NOT,\n//        OP_0NOTEQUAL,\n//        OP_ADD,\n//        OP_SUB,\n//        OP_MUL,\n//        OP_DIV,\n//        OP_MOD,\n//        OP_LSHIFT,\n//        OP_RSHIFT,\n//        OP_BOOLAND,\n//        OP_BOOLOR,\n//        OP_NUMEQUAL,\n//        OP_NUMEQUALVERIFY,\n//        OP_NUMNOTEQUAL,\n//        OP_LESSTHAN,\n//        OP_GREATERTHAN,\n//        OP_LESSTHANOREQUAL,\n//        OP_GREATERTHANOREQUAL,\n//        OP_MIN,\n//        OP_MAX,\n//        OP_WITHIN,\n//        OP_RIPEMD160,\n//        OP_SHA1,\n//        OP_SHA256,\n//        OP_HASH160,\n//        OP_HASH256,\n//        OP_CODESEPARATOR,\n//        OP_CHECKSIG,\n//        OP_CHECKSIGVERIFY,\n//        OP_CHECKMULTISIG,\n//        OP_CHECKMULTISIGVERIFY,\n//        OP_NOP1,\n//        OP_NOP2,\n//        OP_NOP3,\n//        OP_NOP4,\n//        OP_NOP5,\n//        OP_NOP6,\n//        OP_NOP7,\n//        OP_NOP8,\n//        OP_NOP9,\n//        OP_NOP10,\n//        OP_INVALIDOPCODE\n//    ]\n//\n//    internal init() {}\n//}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/Script.swift",
    "content": "//\n//  Script.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\nimport CryptoSwift\n\npublic class Script {\n    // An array of Data objects (pushing data) or UInt8 objects (containing opcodes)\n    private var chunks: [ScriptChunk]\n\n    // Cached serialized representations for -data and -string methods.\n    private var dataCache: Data?\n    private var stringCache: String?\n\n    public var data: Data {\n        // When we calculate data from scratch, it's important to respect actual offsets in the chunks as they may have been copied or shifted in subScript* methods.\n        if let cache = dataCache {\n            return cache\n        }\n        dataCache = chunks.reduce(Data()) { $0 + $1.chunkData }\n        return dataCache!\n    }\n\n    public var string: String {\n        if let cache = stringCache {\n            return cache\n        }\n        stringCache = chunks.map { $0.string }.joined(separator: \" \")\n        return stringCache!\n    }\n\n    public var hex: String {\n        return data.hex\n    }\n\n    public func toP2SH() -> Script {\n        return try! Script()\n            .append(.OP_HASH160)\n            .appendData(RIPEMD160.hash(data.sha256()))\n            .append(.OP_EQUAL)\n    }\n\n    // Multisignature script attribute.\n    // If multisig script is not detected, this is nil\n    public typealias MultisigVariables = (nSigRequired: UInt, publickeys: [PublicKey])\n    public var multisigRequirements: MultisigVariables?\n\n    public init() {\n        self.chunks = [ScriptChunk]()\n    }\n\n    public init(chunks: [ScriptChunk]) {\n        self.chunks = chunks\n    }\n\n    public convenience init?(data: Data) {\n        // It's important to keep around original data to correctly identify the size of the script for BTC_MAX_SCRIPT_SIZE check\n        // and to correctly calculate hash for the signature because in BitcoinQT scripts are not re-serialized/canonicalized.\n        do {\n            let chunks = try Script.parseData(data)\n            self.init(chunks: chunks)\n        } catch let error {\n            print(error)\n            return nil\n        }\n    }\n\n    public convenience init(hex: String) {\n        self.init(data: Data(hex: hex))!\n    }\n\n    public convenience init?(address: Address) {\n        self.init()\n        switch address.type {\n        case .pubkeyHash:\n            // OP_DUP OP_HASH160 <hash> OP_EQUALVERIFY OP_CHECKSIG\n            do {\n                try self.append(.OP_DUP)\n                    .append(.OP_HASH160)\n                    .appendData(address.data)\n                    .append(.OP_EQUALVERIFY)\n                    .append(.OP_CHECKSIG)\n            } catch {\n                return nil\n            }\n        case .scriptHash:\n            // OP_HASH160 <hash> OP_EQUAL\n            do {\n                try self.append(.OP_HASH160)\n                    .appendData(address.data)\n                    .append(.OP_EQUAL)\n            } catch {\n                return nil\n            }\n        default:\n            return nil\n        }\n    }\n\n    // OP_<M> <pubkey1> ... <pubkeyN> OP_<N> OP_CHECKMULTISIG\n    public convenience init?(publicKeys: [PublicKey], signaturesRequired: UInt) {\n        // First make sure the arguments make sense.\n        // We need at least one signature\n        guard signaturesRequired > 0 else {\n            return nil\n        }\n\n        // And we cannot have more signatures than available pubkeys.\n        guard publicKeys.count >= signaturesRequired else {\n            return nil\n        }\n\n        // Both M and N should map to OP_<1..16>\n        let mOpcode: OpCode = OpCodeFactory.opcode(for: Int(signaturesRequired))\n        let nOpcode: OpCode = OpCodeFactory.opcode(for: publicKeys.count)\n\n        guard mOpcode != .OP_INVALIDOPCODE else {\n            return nil\n        }\n        guard nOpcode != .OP_INVALIDOPCODE else {\n            return nil\n        }\n        do {\n            self.init()\n            try append(mOpcode)\n            for pubkey in publicKeys {\n                try appendData(pubkey.data)\n            }\n            try append(nOpcode)\n            try append(.OP_CHECKMULTISIG)\n            multisigRequirements = (signaturesRequired, publicKeys)\n        } catch {\n            return nil\n        }\n    }\n\n    private static func parseData(_ data: Data) throws -> [ScriptChunk] {\n        guard !data.isEmpty else {\n            return [ScriptChunk]()\n        }\n\n        var chunks = [ScriptChunk]()\n\n        var i: Int = 0\n        let count: Int = data.count\n\n        while i < count {\n            // Exit if failed to parse\n            let chunk = try ScriptChunkHelper.parseChunk(from: data, offset: i)\n            chunks.append(chunk)\n            i += chunk.range.count\n        }\n        return chunks\n    }\n\n    public var isStandard: Bool {\n        return isPayToPublicKeyHashScript\n            || isPayToScriptHashScript\n            || isPublicKeyScript\n            || isStandardMultisignatureScript\n    }\n\n    public var isPublicKeyScript: Bool {\n        guard chunks.count == 2 else {\n            return false\n        }\n        guard let pushdata = pushedData(at: 0) else {\n            return false\n        }\n        return pushdata.count > 1 && opcode(at: 1) == OpCode.OP_CHECKSIG\n    }\n\n    public var isPayToPublicKeyHashScript: Bool {\n        guard chunks.count == 5 else {\n            return false\n        }\n        guard let dataChunk = chunk(at: 2) as? DataChunk else {\n            return false\n        }\n        return opcode(at: 0) == OpCode.OP_DUP\n            && opcode(at: 1) == OpCode.OP_HASH160\n            && dataChunk.range.count == 21\n            && opcode(at: 3) == OpCode.OP_EQUALVERIFY\n            && opcode(at: 4) == OpCode.OP_CHECKSIG\n    }\n\n    public var isPayToScriptHashScript: Bool {\n        guard chunks.count == 3 else {\n            return false\n        }\n        return opcode(at: 0) == OpCode.OP_HASH160\n            && pushedData(at: 1)?.count == 20 // this is enough to match the exact byte template, any other encoding will be larger.\n            && opcode(at: 2) == OpCode.OP_EQUAL\n    }\n\n    // Returns true if the script ends with P2SH check.\n    // Not used in CoreBitcoin. Similar code is used in bitcoin-ruby. I don't know if we'll ever need it.\n    public var endsWithPayToScriptHash: Bool {\n        guard chunks.count >= 3 else {\n            return false\n        }\n        return opcode(at: -3) == OpCode.OP_HASH160\n            && pushedData(at: -2)?.count == 20\n            && opcode(at: -1) == OpCode.OP_EQUAL\n    }\n\n    public var isStandardMultisignatureScript: Bool {\n        guard isMultisignatureScript else {\n            return false\n        }\n        guard let multisigPublicKeys = multisigRequirements?.publickeys else {\n            return false\n        }\n        return multisigPublicKeys.count <= 3\n    }\n\n    public var isMultisignatureScript: Bool {\n        guard let requirements = multisigRequirements else {\n            return false\n        }\n        if requirements.nSigRequired == 0 {\n            detectMultisigScript()\n        }\n\n        return requirements.nSigRequired > 0\n    }\n\n    public var isStandardOpReturnScript: Bool {\n        guard chunks.count == 2 else {\n            return false\n        }\n        return opcode(at: 0) == .OP_RETURN\n            && pushedData(at: 1) != nil\n    }\n\n    public func standardOpReturnData() -> Data? {\n        guard isStandardOpReturnScript else {\n            return nil\n        }\n        return pushedData(at: 1)\n    }\n\n    // If typical multisig tx is detected, sets requirements:\n    private func detectMultisigScript() {\n        // multisig script must have at least 4 ops (\"OP_1 <pubkey> OP_1 OP_CHECKMULTISIG\")\n        guard chunks.count >= 4 else {\n            return\n        }\n\n        // The last op is multisig check.\n        guard opcode(at: -1) == OpCode.OP_CHECKMULTISIG else {\n            return\n        }\n\n        let mOpcode: OpCode = opcode(at: 0)\n        let nOpcode: OpCode = opcode(at: -2)\n\n        let m: Int = OpCodeFactory.smallInteger(from: mOpcode)\n        let n: Int = OpCodeFactory.smallInteger(from: nOpcode)\n\n        guard m > 0 && m != Int.max else {\n            return\n        }\n        guard n > 0 && n != Int.max && n >= m else {\n            return\n        }\n\n        // We must have correct number of pubkeys in the script. 3 extra ops: OP_<M>, OP_<N> and OP_CHECKMULTISIG\n        guard chunks.count == 3 + n else {\n            return\n        }\n\n        var pubkeys: [PublicKey] = []\n        for i in 0...n {\n            guard let data = pushedData(at: i) else {\n                return\n            }\n            // TODO: Other coins\n            let pubkey = PublicKey(privateKey: data, coin: .bitcoin)\n            pubkeys.append(pubkey)\n        }\n\n        // Now we extracted all pubkeys and verified the numbers.\n        multisigRequirements = (UInt(m), pubkeys)\n    }\n\n    // Include both PUSHDATA ops and OP_0..OP_16 literals.\n    public var isDataOnly: Bool {\n        return !chunks.contains { $0.opcodeValue > OpCode.OP_16 }\n    }\n\n    public var scriptChunks: [ScriptChunk] {\n        return chunks\n    }\n\n    // MARK: - Modification\n    public func invalidateSerialization() {\n        dataCache = nil\n        stringCache = nil\n        multisigRequirements = nil\n    }\n\n    private func update(with updatedData: Data) throws {\n        let updatedChunks = try Script.parseData(updatedData)\n        chunks = updatedChunks\n        invalidateSerialization()\n    }\n\n    @discardableResult\n    public func append(_ opcode: OpCode) throws -> Script {\n        let invalidOpCodes: [OpCode] = [.OP_PUSHDATA1,\n                                                .OP_PUSHDATA2,\n                                                .OP_PUSHDATA4,\n                                                .OP_INVALIDOPCODE]\n        guard !invalidOpCodes.contains(where: { $0 == opcode }) else {\n            throw ScriptError.error(\"\\(opcode.name) cannot be executed alone.\")\n        }\n        var updatedData: Data = data\n        updatedData += opcode\n        try update(with: updatedData)\n        return self\n    }\n\n    @discardableResult\n    public func appendData(_ newData: Data) throws -> Script {\n        guard !newData.isEmpty else {\n            throw ScriptError.error(\"Data is empty.\")\n        }\n\n        guard let addedScriptData = ScriptChunkHelper.scriptData(for: newData, preferredLengthEncoding: -1) else {\n            throw ScriptError.error(\"Parse data to pushdata failed.\")\n        }\n        var updatedData: Data = data\n        updatedData += addedScriptData\n        try update(with: updatedData)\n        return self\n    }\n\n    @discardableResult\n    public func appendScript(_ otherScript: Script) throws -> Script {\n        guard !otherScript.data.isEmpty else {\n            throw ScriptError.error(\"Script is empty.\")\n        }\n\n        var updatedData: Data = self.data\n        updatedData += otherScript.data\n        try update(with: updatedData)\n        return self\n    }\n\n    @discardableResult\n    public func deleteOccurrences(of data: Data) throws -> Script {\n        guard !data.isEmpty else {\n            return self\n        }\n\n        let updatedData = chunks.filter { ($0 as? DataChunk)?.pushedData != data }.reduce(Data()) { $0 + $1.chunkData }\n        try update(with: updatedData)\n        return self\n    }\n\n    @discardableResult\n    public func deleteOccurrences(of opcode: OpCode) throws -> Script {\n        let updatedData = chunks.filter { $0.opCode != opcode }.reduce(Data()) { $0 + $1.chunkData }\n        try update(with: updatedData)\n        return self\n    }\n\n    public func subScript(from index: Int) throws -> Script {\n        let subScript: Script = Script()\n        for chunk in chunks[index..<chunks.count] {\n            try subScript.appendData(chunk.chunkData)\n        }\n        return subScript\n    }\n\n    public func subScript(to index: Int) throws -> Script {\n        let subScript: Script = Script()\n        for chunk in chunks[0..<index] {\n            try subScript.appendData(chunk.chunkData)\n        }\n        return subScript\n    }\n\n    // MARK: - Utility methods\n    // Raise exception if index is out of bounds\n    public func chunk(at index: Int) -> ScriptChunk {\n        return chunks[index < 0 ? chunks.count + index : index]\n    }\n\n    // Returns an opcode in a chunk.\n    // If the chunk is data, not an opcode, returns OP_INVALIDOPCODE\n    // Raises exception if index is out of bounds.\n    public func opcode(at index: Int) -> OpCode {\n        let chunk = self.chunk(at: index)\n        // If the chunk is not actually an opcode, return invalid opcode.\n        guard chunk is OpcodeChunk else {\n            return .OP_INVALIDOPCODE\n        }\n        return chunk.opCode\n    }\n\n    // Returns Data in a chunk.\n    // If chunk is actually an opcode, returns nil.\n    // Raises exception if index is out of bounds.\n    public func pushedData(at index: Int) -> Data? {\n        let chunk = self.chunk(at: index)\n        return (chunk as? DataChunk)?.pushedData\n    }\n\n    public func execute(with context: ScriptExecutionContext) throws {\n        for chunk in chunks {\n            if let opChunk = chunk as? OpcodeChunk {\n                try opChunk.opCode.execute(context)\n            } else if let dataChunk = chunk as? DataChunk {\n                if context.shouldExecute {\n                    try context.pushToStack(dataChunk.pushedData)\n                }\n            } else {\n                throw ScriptMachineError.error(\"Unknown chunk\")\n            }\n        }\n\n        guard context.conditionStack.isEmpty else {\n            throw ScriptMachineError.error(\"Condition branches not balanced.\")\n        }\n    }\n}\n\nextension Script {\n    // Standard Transaction to Bitcoin address (pay-to-pubkey-hash)\n    // scriptPubKey: OP_DUP OP_HASH160 <pubKeyHash> OP_EQUALVERIFY OP_CHECKSIG\n    public static func buildPublicKeyHashOut(pubKeyHash: Data) -> Data {\n        let values: [[UInt8]] = [\n            [OpCode.OP_DUP.value, OpCode.OP_HASH160.value, UInt8(pubKeyHash.count)],\n            pubKeyHash.bytes,\n            [OpCode.OP_EQUALVERIFY.value,  OpCode.OP_CHECKSIG.value]\n        ]\n        return Data(values.reduce([], +))\n    }\n\n    public static func buildPublicKeyUnlockingScript(signature: Data, pubkey: PublicKey, hashType: SighashType) -> Data {\n        var data: Data = Data([UInt8(signature.count + 1)]) + signature + UInt8(hashType)\n        data += VarInt(pubkey.data.count).serialized()\n        data += pubkey.data\n        return data\n    }\n\n    public static func isPublicKeyHashOut(_ script: Data) -> Bool {\n        return script.count == 25 &&\n            script[0] == OpCode.OP_DUP && script[1] == OpCode.OP_HASH160 && script[2] == 20 &&\n            script[23] == OpCode.OP_EQUALVERIFY && script[24] == OpCode.OP_CHECKSIG\n    }\n\n    public static func getPublicKeyHash(from script: Data) -> Data {\n        return script[3..<23]\n    }\n}\n\nextension Script: CustomStringConvertible {\n    public var description: String {\n        return string\n    }\n}\n\nenum ScriptError: Error {\n    case error(String)\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/ScriptChunk.swift",
    "content": "//\n//  ScriptChunk.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic protocol ScriptChunk {\n    // Reference to the whole script binary data.\n    var scriptData: Data { get }\n    // A range of scriptData represented by this chunk.\n    var range: Range<Int> { get }\n\n    // Portion of scriptData defined by range.\n    var chunkData: Data { get }\n    // OP_CODE of scriptData defined by range.\n    var opCode: OpCode { get }\n    // String representation of a chunk.\n    var string: String { get }\n\n    // OP_1NEGATE, OP_0, OP_1..OP_16 are represented as a decimal number.\n    // Most compactly represented pushdata chunks >=128 bit are encoded as <hex string>\n    // Smaller most compactly represented data is encoded as [<hex string>]\n    // Non-compact pushdata (e.g. 75-byte string with PUSHDATA1) contains a decimal prefix denoting a length size before hex data in square brackets. Ex. \"1:[...]\", \"2:[...]\" or \"4:[...]\"\n    // For both compat and non-compact pushdata chunks, if the data consists of all printable characters (0x20..0x7E), it is enclosed not in square brackets, but in single quotes as characters themselves. Non-compact string is prefixed with 1:, 2: or 4: like described above.\n\n    // Some other guys (BitcoinQT, bitcoin-ruby) encode \"small enough\" integers in decimal numbers and do that differently.\n    // BitcoinQT encodes any data less than 4 bytes as a decimal number.\n    // bitcoin-ruby encodes 2..16 as decimals, 0 and -1 as opcode names and the rest is in hex.\n    // Now no matter which encoding you use, it can be parsed incorrectly.\n    // Also: pushdata operations are typically encoded in a raw data which can be encoded in binary differently.\n    // This means, you'll never be able to parse a sane-looking script into only one binary.\n    // So forget about relying on parsing this thing exactly. Typically, we either have very small numbers (0..16),\n    // or very big numbers (hashes and pubkeys).\n}\n\nextension ScriptChunk {\n    public var opCode: OpCode {\n        return OpCodeFactory.get(with: opcodeValue)\n    }\n\n    public var opcodeValue: UInt8 {\n        return UInt8(scriptData[range.lowerBound])\n    }\n\n    public var chunkData: Data {\n        return scriptData.subdata(in: range)\n    }\n\n    public func updated(scriptData data: Data) -> ScriptChunk {\n        if self is DataChunk {\n            return DataChunk(scriptData: data, range: range)\n        } else {\n            return OpcodeChunk(scriptData: data, range: range)\n        }\n    }\n\n    public func updated(scriptData data: Data, range updatedRange: Range<Int>) -> ScriptChunk {\n        if self is DataChunk {\n            return DataChunk(scriptData: data, range: updatedRange)\n        } else {\n            return OpcodeChunk(scriptData: data, range: updatedRange)\n        }\n    }\n\n}\n\npublic struct OpcodeChunk: ScriptChunk {\n    public var scriptData: Data\n    public var range: Range<Int>\n\n    public init(scriptData: Data, range: Range<Int>) {\n        self.scriptData = scriptData\n        self.range = range\n    }\n\n    public var string: String {\n        return opCode.name\n    }\n}\n\npublic struct DataChunk: ScriptChunk {\n    public var scriptData: Data\n    public var range: Range<Int>\n\n    public init(scriptData: Data, range: Range<Int>) {\n        self.scriptData = scriptData\n        self.range = range\n    }\n\n    public var pushedData: Data {\n        return data\n    }\n\n    private var data: Data {\n        var loc: Int = 1\n        if opCode == OpCode.OP_PUSHDATA1 {\n            loc += 1\n        } else if opCode == OpCode.OP_PUSHDATA2 {\n            loc += 2\n        } else if opCode == OpCode.OP_PUSHDATA4 {\n            loc += 4\n        }\n\n        return scriptData.subdata(in: (range.lowerBound + loc)..<(range.upperBound))\n    }\n\n    public var string: String {\n        var string: String\n        guard !data.isEmpty else {\n            return \"OP_0\" // Empty data is encoded as OP_0.\n        }\n\n        if isASCIIData(data: data) {\n            string = String(data: data, encoding: String.Encoding.ascii)!\n\n            // Escape escapes & single quote characters.\n            string = string.replacingOccurrences(of: \"\\\\\", with: \"\\\\\\\\\")\n            string = string.replacingOccurrences(of: \"'\", with: \"\\\\'\")\n\n            // Wrap in single quotes. Why not double? Because they are already used in JSON and we don't want to multiply the mess.\n            string = \"'\" + string + \"'\"\n        } else {\n            string = data.hex\n\n            // Shorter than 128-bit chunks are wrapped in square brackets to avoid ambiguity with big all-decimal numbers.\n            if data.count < 16 {\n                string = \"[\\(string)]\"\n            }\n        }\n        // Non-compact data is prefixed with an appropriate length prefix.\n        if !isDataCompact {\n            var prefix = 1\n            if opCode == OpCode.OP_PUSHDATA2 {\n                prefix = 2\n            } else if opCode == OpCode.OP_PUSHDATA4 {\n                prefix = 4\n            }\n\n            string = String(prefix) + \":\" + string\n        }\n        return string\n    }\n\n    // Returns true if the data is represented with the most compact opcode.\n    public var isDataCompact: Bool {\n        switch opCode.value {\n        case ...OpCode.OP_PUSHDATA1.value:\n            return true // length fits in one byte under OP_PUSHDATA1.\n        case OpCode.OP_PUSHDATA1.value:\n            return data.count >= OpCode.OP_PUSHDATA1.value // length should not be less than OP_PUSHDATA1\n        case OpCode.OP_PUSHDATA2.value:\n            return data.count > (0xff) // length should not fit in one byte\n        case OpCode.OP_PUSHDATA4.value:\n            return data.count > (0xffff) // length should not fit in two bytes\n        default:\n            return false\n        }\n    }\n\n    private func isASCIIData(data: Data) -> Bool {\n        for ch in data {\n            if !(ch >= 0x20 && ch <= 0x7E) {\n                return false\n            }\n        }\n        return true\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/ScriptChunkHelper.swift",
    "content": "//\n//  ScriptChunkHelper.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic enum ScriptChunkError: Error {\n    case error(String)\n}\n\npublic struct ScriptChunkHelper {\n    // If encoding is -1, then the most compact will be chosen.\n    // Valid values: -1, 0, 1, 2, 4.\n    // Returns nil if preferredLengthEncoding can't be used for data, or data is nil or too big.\n    public static func scriptData(for data: Data, preferredLengthEncoding: Int) -> Data? {\n        var scriptData: Data = Data()\n\n        if data.count < OpCode.OP_PUSHDATA1 && preferredLengthEncoding <= 0 {\n            // do nothing\n            scriptData += UInt8(data.count)\n        } else if data.count <= (0xff) && (preferredLengthEncoding == -1 || preferredLengthEncoding == 1) {\n            scriptData += OpCode.OP_PUSHDATA1\n            scriptData += UInt8(data.count)\n        } else if data.count <= (0xffff) && (preferredLengthEncoding == -1 || preferredLengthEncoding == 2) {\n            scriptData += OpCode.OP_PUSHDATA2\n            scriptData += UInt16(data.count)\n        } else if UInt64(data.count) <= 0xffffffff && (preferredLengthEncoding == -1 || preferredLengthEncoding == 4) {\n            scriptData += OpCode.OP_PUSHDATA4\n            scriptData += UInt64(data.count)\n        } else {\n            // Invalid preferredLength encoding or data size is too big.\n            return nil\n        }\n        scriptData += data\n        return scriptData\n    }\n\n    public static func parseChunk(from scriptData: Data, offset: Int) throws -> ScriptChunk {\n        // Data should fit at least one opcode.\n        guard scriptData.count > offset else {\n            throw ScriptChunkError.error(\"Parse ScriptChunk failed. Offset is out of range.\")\n        }\n\n        let opcode: UInt8 = scriptData[offset]\n\n        if opcode > OpCode.OP_PUSHDATA4 {\n            // simple opcode\n            let range = offset..<offset + MemoryLayout.size(ofValue: opcode)\n            return OpcodeChunk(scriptData: scriptData, range: range)\n        } else {\n            // push data\n            return try parseDataChunk(from: scriptData, offset: offset, opcode: opcode)\n        }\n    }\n\n    private static func parseDataChunk(from scriptData: Data, offset: Int, opcode: UInt8) throws -> DataChunk {\n        // for range\n        let count: Int = scriptData.count\n        let chunkLength: Int\n\n        switch opcode {\n        case 0..<OpCode.OP_PUSHDATA1.value:\n            let dataLength = opcode\n            chunkLength = MemoryLayout.size(ofValue: opcode) + Int(dataLength)\n        case OpCode.OP_PUSHDATA1.value:\n            var dataLength = UInt8()\n            guard offset + MemoryLayout.size(ofValue: dataLength) <= count else {\n                throw ScriptChunkError.error(\"Parse DataChunk failed. OP_PUSHDATA1 error\")\n            }\n            _ = scriptData.withUnsafeBytes({ (pointer) -> Void in\n                guard let baseAddress = pointer.baseAddress else { return }\n                memcpy(&dataLength, baseAddress + offset + MemoryLayout.size(ofValue: opcode), MemoryLayout.size(ofValue: dataLength))\n            })\n            chunkLength = MemoryLayout.size(ofValue: opcode) + MemoryLayout.size(ofValue: dataLength) + Int(dataLength)\n        case OpCode.OP_PUSHDATA2.value:\n            var dataLength = UInt16()\n            guard offset + MemoryLayout.size(ofValue: dataLength) <= count else {\n                throw ScriptChunkError.error(\"Parse DataChunk failed.  OP_PUSHDATA2 error\")\n            }\n            _ = scriptData.withUnsafeBytes({ (pointer) -> Void in\n                guard let baseAddress = pointer.baseAddress else { return }\n                memcpy(&dataLength, baseAddress + offset + MemoryLayout.size(ofValue: opcode), MemoryLayout.size(ofValue: dataLength))\n            })\n            dataLength = CFSwapInt16LittleToHost(dataLength)\n            chunkLength = MemoryLayout.size(ofValue: opcode) + MemoryLayout.size(ofValue: dataLength) + Int(dataLength)\n        case OpCode.OP_PUSHDATA4.value:\n            var dataLength = UInt32()\n            guard offset + MemoryLayout.size(ofValue: dataLength) <= count else {\n                throw ScriptChunkError.error(\"Parse DataChunk failed.  OP_PUSHDATA4 error\")\n            }\n            _ = scriptData.withUnsafeBytes({ (pointer) -> Void in\n                guard let baseAddress = pointer.baseAddress else { return }\n                memcpy(&dataLength, baseAddress + offset + MemoryLayout.size(ofValue: opcode), MemoryLayout.size(ofValue: dataLength))\n            })\n            dataLength = CFSwapInt32LittleToHost(dataLength) // CoreBitcoin uses CFSwapInt16LittleToHost(dataLength)\n            chunkLength = MemoryLayout.size(ofValue: opcode) + MemoryLayout.size(ofValue: dataLength) + Int(dataLength)\n        default:\n            // cannot happen because it's opcode\n            throw ScriptChunkError.error(\"Parse DataChunk failed. OP_CODE: \\(opcode).\")\n        }\n\n        guard offset + chunkLength <= count else {\n            throw ScriptChunkError.error(\"Parse DataChunk failed. Push data is out of bounds error.\")\n        }\n        let range: Range<Int> = offset..<offset + chunkLength\n        return DataChunk(scriptData: scriptData, range: range)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/ScriptExecutionContext.swift",
    "content": "//\n//  ScriptExecutionContext.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic class ScriptExecutionContext {\n    // Flags affecting verification. Default is the most liberal verification.\n    // One can be stricter to not relay transactions with non-canonical signatures and pubkey (as BitcoinQT does).\n    // Defaults in CoreBitcoin: be liberal in what you accept and conservative in what you send.\n    // So we try to create canonical purist transactions but have no problem accepting and working with non-canonical ones.\n    public var verificationFlags: ScriptVerification?\n\n    // Stack contains Data objects that are interpreted as numbers, bignums, booleans or raw data when needed.\n    public internal(set) var stack = [Data]()\n    // Used in ALTSTACK ops.\n    public internal(set) var altStack = [Data]()\n    // Holds an array of Bool values to keep track of if/else branches.\n    public internal(set) var conditionStack = [Bool]()\n\n    // Keeps number of executed operations to check for limit.\n    public internal(set) var opCount: Int = 0\n\n    // Transaction, utxo, index for CHECKSIG operations\n    public private(set) var transaction: Transaction?\n    public private(set) var utxoToVerify: TransactionOutput?\n    public private(set) var txinToVerify: TransactionInput?\n    public private(set) var inputIndex: UInt32 = 0xffffffff\n\n    // A timestamp of the current block. Default is current timestamp.\n    // This is used to test for P2SH scripts or other changes in the protocol that may happen in the future.\n    public var blockTimeStamp: UInt32 = UInt32(Date().timeIntervalSince1970)\n\n    // Constants\n    private let blobFalse: Data = Data()\n    private let blobZero: Data = Data()\n    private let blobTrue: Data = Data([UInt8(1)])\n\n    // If verbose is true, stack will be printed each time OP_CODEs are executed\n    public var verbose: Bool = false\n\n    public init(isDebug: Bool = false) {\n        self.verbose = isDebug\n    }\n    public init?(transaction: Transaction, utxoToVerify: TransactionOutput, inputIndex: UInt32) {\n        guard transaction.inputs.count > inputIndex else {\n            return nil\n        }\n        self.transaction = transaction\n        self.utxoToVerify = utxoToVerify\n        self.txinToVerify = transaction.inputs[Int(inputIndex)]\n        self.inputIndex = inputIndex\n    }\n    public var shouldExecute: Bool {\n        return !conditionStack.contains(false)\n    }\n\n    public func shouldVerifyP2SH() -> Bool {\n        return blockTimeStamp >= BTC_BIP16_TIMESTAMP\n    }\n\n    private func normalized(_ index: Int) -> Int {\n        return (index < 0) ? stack.count + index : index\n    }\n\n    // stack\n    public func pushToStack(_ bool: Bool) {\n        stack.append(bool ? blobTrue : blobFalse)\n    }\n    public func pushToStack(_ n: Int32) throws {\n        stack.append(BigNumber(n.littleEndian).data)\n    }\n    public func pushToStack(_ data: Data) throws {\n        guard data.count <= BTC_MAX_SCRIPT_ELEMENT_SIZE else {\n            throw ScriptMachineError.error(\"PushedData size is too big.\")\n        }\n        stack.append(data)\n    }\n    public func resetStack() {\n        stack = []\n        altStack = []\n        conditionStack = []\n    }\n    public func swapDataAt(i: Int, j: Int) {\n        stack.swapAt(normalized(i), normalized(j))\n    }\n\n    public func assertStackHeightGreaterThanOrEqual(_ n: Int) throws {\n        guard stack.count >= n else {\n            throw OpCodeExecutionError.opcodeRequiresItemsOnStack(n)\n        }\n    }\n\n    public func assertAltStackHeightGreaterThanOrEqual(_ n: Int) throws {\n        guard altStack.count >= n else {\n            throw OpCodeExecutionError.error(\"Operation requires \\(n) items on altstack.\")\n        }\n    }\n\n    // OpCount\n    public func incrementOpCount(by i: Int = 1) throws {\n        opCount += i\n        guard opCount <= BTC_MAX_OPS_PER_SCRIPT else {\n            throw OpCodeExecutionError.error(\"Exceeded the allowed number of operations per script.\")\n        }\n    }\n\n    public func deserializeP2SHLockScript(stackForP2SH: [Data]) throws -> Script {\n        var stackForP2SH: [Data] = stackForP2SH\n\n        // Instantiate the script from the last data on the stack.\n        guard let last = stackForP2SH.last, let deserializedLockScript = Script(data: last) else {\n            // stackForP2SH cannot be empty here, because if it was the\n            // P2SH  HASH <> EQUAL  scriptPubKey would be evaluated with\n            // an empty stack and the runScript: above would return NO.\n            throw ScriptMachineError.exception(\"internal inconsistency: stackForP2SH cannot be empty at this point.\")\n        }\n\n        // Remove it from the stack.\n        stackForP2SH.removeLast()\n\n        // Replace current stack with P2SH stack.\n        resetStack()\n        stack = stackForP2SH\n        return deserializedLockScript\n    }\n\n    public func data(at i: Int) -> Data {\n        return stack[normalized(i)]\n    }\n\n    public func number(at i: Int) throws -> Int32 {\n        let data: Data = stack[normalized(i)]\n        guard data.count <= 4 else {\n            throw OpCodeExecutionError.invalidBignum\n        }\n\n        return BigNumber(data).int32\n    }\n\n    public func bool(at i: Int) -> Bool {\n        let data: Data = stack[normalized(i)]\n        guard !data.isEmpty else {\n            return false\n        }\n\n        for (i, byte) in data.enumerated() where byte != 0 {\n            // Can be negative zero, also counts as false\n            if i == (data.count - 1) && byte == 0x80 {\n                return false\n            }\n            return true\n        }\n        return false\n    }\n}\n\nextension ScriptExecutionContext: CustomStringConvertible {\n    public var description: String {\n        var desc: String = \"\"\n        for data in stack.reversed() {\n            let hex = data.hex\n            var contents: String = \"0x\" + hex\n\n            if hex.count > 20 {\n                let first = hex.prefix(5)\n                let last = hex.suffix(5)\n                contents = \"\\(first)..\\(last) [\\(data.count)bytes]\"\n            }\n\n            if contents == \"0x\" {\n                contents = \"NULL [FALSE/0]\"\n            }\n\n            if contents == \"0x01\" {\n                contents = \"0x01 [TRUE/1]\"\n            }\n\n            for _ in 0...(24 - contents.count) / 2 {\n                contents = \" \\(contents) \"\n            }\n            desc += \"| \\(contents) |\\n\"\n        }\n        var base: String = \"\"\n        (0...14).forEach { _ in\n            base = \"=\\(base)=\"\n        }\n        return desc + base + \"\\n\"\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/ScriptFactory.swift",
    "content": "//\n//  ScriptFactory.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic struct ScriptFactory {\n    // Basic\n    public struct Standard {}\n    public struct LockTime {}\n    public struct MultiSig {}\n    public struct OpReturn {}\n    public struct Condition {}\n\n    // Contract\n    public struct HashedTimeLockedContract {}\n}\n\n// MARK: - Standard\npublic extension ScriptFactory.Standard {\n    static func buildP2PK(publickey: PublicKey) -> Script? {\n        return try? Script()\n            .appendData(publickey.data)\n            .append(.OP_CHECKSIG)\n    }\n\n    static func buildP2PKH(address: Address) -> Script? {\n        return Script(address: address)\n    }\n\n    static func buildP2SH(script: Script) -> Script {\n        return script.toP2SH()\n    }\n\n    static func buildMultiSig(publicKeys: [PublicKey]) -> Script? {\n        return Script(publicKeys: publicKeys, signaturesRequired: UInt(publicKeys.count))\n    }\n    static func buildMultiSig(publicKeys: [PublicKey], signaturesRequired: UInt) -> Script? {\n        return Script(publicKeys: publicKeys, signaturesRequired: signaturesRequired)\n    }\n}\n\n// MARK: - LockTime\npublic extension ScriptFactory.LockTime {\n    // Base\n    static func build(script: Script, lockDate: Date) -> Script? {\n        return try? Script()\n            .appendData(lockDate.bigNumData)\n            .append(.OP_CHECKLOCKTIMEVERIFY)\n            .append(.OP_DROP)\n            .appendScript(script)\n    }\n\n    static func build(script: Script, lockIntervalSinceNow: TimeInterval) -> Script? {\n        let lockDate = Date(timeIntervalSinceNow: lockIntervalSinceNow)\n        return build(script: script, lockDate: lockDate)\n    }\n\n    // P2PKH + LockTime\n    static func build(address: Address, lockIntervalSinceNow: TimeInterval) -> Script? {\n        guard let p2pkh = Script(address: address) else {\n            return nil\n        }\n        let lockDate = Date(timeIntervalSinceNow: lockIntervalSinceNow)\n        return build(script: p2pkh, lockDate: lockDate)\n    }\n\n    static func build(address: Address, lockDate: Date) -> Script? {\n        guard let p2pkh = Script(address: address) else {\n            return nil\n        }\n        return build(script: p2pkh, lockDate: lockDate)\n    }\n}\n\n// MARK: - OpReturn\npublic extension ScriptFactory.OpReturn {\n    static func build(text: String) -> Script? {\n        let MAX_OP_RETURN_DATA_SIZE: Int = 220\n        guard let data = text.data(using: .utf8), data.count <= MAX_OP_RETURN_DATA_SIZE else {\n            return nil\n        }\n        return try? Script()\n            .append(.OP_RETURN)\n            .appendData(data)\n    }\n}\n\n// MARK: - Condition\npublic extension ScriptFactory.Condition {\n    static func build(scripts: [Script]) -> Script? {\n\n        guard !scripts.isEmpty else {\n            return nil\n        }\n        guard scripts.count > 1 else {\n            return scripts[0]\n        }\n\n        var scripts: [Script] = scripts\n\n        while scripts.count > 1 {\n            var newScripts: [Script] = []\n            while !scripts.isEmpty {\n                let script = Script()\n                do {\n                    if scripts.count == 1 {\n                        try script\n                            .append(.OP_DROP)\n                            .appendScript(scripts.removeFirst())\n                    } else {\n                        try script\n                            .append(.OP_IF)\n                            .appendScript(scripts.removeFirst())\n                            .append(.OP_ELSE)\n                            .appendScript(scripts.removeFirst())\n                            .append(.OP_ENDIF)\n                    }\n                } catch {\n                    return nil\n                }\n                newScripts.append(script)\n            }\n            scripts = newScripts\n        }\n\n        return scripts[0]\n    }\n}\n\n// MARK: - HTLC\n/*\n OP_IF\n    [HASHOP] <digest> OP_EQUALVERIFY OP_DUP OP_HASH160 <recipient pubkey hash>\n OP_ELSE\n    <num> [TIMEOUTOP] OP_DROP OP_DUP OP_HASH160 <sender pubkey hash>\n OP_ENDIF\n OP_EQUALVERIFYs\n OP_CHECKSIG\n*/\npublic extension ScriptFactory.HashedTimeLockedContract {\n    // Base\n    static func build(recipient: Address, sender: Address, lockDate: Date, hash: Data, hashOp: HashOperator) -> Script? {\n        guard hash.count == hashOp.hashSize else {\n            return nil\n        }\n\n        return try? Script()\n            .append(.OP_IF)\n                .append(hashOp.opcode)\n                .appendData(hash)\n                .append(.OP_EQUALVERIFY)\n                .append(.OP_DUP)\n                .append(.OP_HASH160)\n                .appendData(recipient.data)\n            .append(.OP_ELSE)\n                .appendData(lockDate.bigNumData)\n                .append(.OP_CHECKLOCKTIMEVERIFY)\n                .append(.OP_DROP)\n                .append(.OP_DUP)\n                .append(.OP_HASH160)\n                .appendData(sender.data)\n            .append(.OP_ENDIF)\n            .append(.OP_EQUALVERIFY)\n            .append(.OP_CHECKSIG)\n    }\n\n    // convenience\n    static func build(recipient: Address, sender: Address, lockIntervalSinceNow: TimeInterval, hash: Data, hashOp: HashOperator) -> Script? {\n        let lockDate = Date(timeIntervalSinceNow: lockIntervalSinceNow)\n        return build(recipient: recipient, sender: sender, lockDate: lockDate, hash: hash, hashOp: hashOp)\n    }\n\n    static func build(recipient: Address, sender: Address, lockIntervalSinceNow: TimeInterval, secret: Data, hashOp: HashOperator) -> Script? {\n        let hash = hashOp.hash(secret)\n        let lockDate = Date(timeIntervalSinceNow: lockIntervalSinceNow)\n        return build(recipient: recipient, sender: sender, lockDate: lockDate, hash: hash, hashOp: hashOp)\n    }\n\n    static func build(recipient: Address, sender: Address, lockDate: Date, secret: Data, hashOp: HashOperator) -> Script? {\n        let hash = hashOp.hash(secret)\n        return build(recipient: recipient, sender: sender, lockDate: lockDate, hash: hash, hashOp: hashOp)\n    }\n\n}\n\npublic class HashOperator {\n    public static let SHA256: HashOperator = HashOperatorSha256()\n    public static let HASH160: HashOperator = HashOperatorHash160()\n\n    public var opcode: OpCode { return .OP_INVALIDOPCODE }\n    public var hashSize: Int { return 0 }\n    public func hash(_ data: Data) -> Data { return Data() }\n    fileprivate init() {}\n}\n\nfinal public class HashOperatorSha256: HashOperator {\n    override public var opcode: OpCode { return .OP_SHA256 }\n    override public var hashSize: Int { return 32 }\n\n    override public func hash(_ data: Data) -> Data {\n        return data.sha256()\n    }\n}\n\nfinal public class HashOperatorHash160: HashOperator {\n    override public var opcode: OpCode { return .OP_HASH160 }\n    override public var hashSize: Int { return 20 }\n\n    override public func hash(_ data: Data) -> Data {\n        return RIPEMD160.hash(data.sha256())\n    }\n}\n\n// MARK: - Utility Extension\nprivate extension Date {\n    var bigNumData: Data {\n        let dateUnix: TimeInterval = timeIntervalSince1970\n        let bn = BigNumber(Int32(dateUnix).littleEndian)\n        return bn.data\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/BitcoinScript/ScriptMachine.swift",
    "content": "//\n//  ScriptMachine.swift\n//\n//  Copyright © 2018 BitcoinKit developers\n//\n//  Permission is hereby granted, free of charge, to any person obtaining a copy\n//  of this software and associated documentation files (the \"Software\"), to deal\n//  in the Software without restriction, including without limitation the rights\n//  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n//  copies of the Software, and to permit persons to whom the Software is\n//  furnished to do so, subject to the following conditions:\n//\n//  The above copyright notice and this permission notice shall be included in\n//  all copies or substantial portions of the Software.\n//\n//  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n//  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n//  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n//  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n//  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n//  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n//  THE SOFTWARE.\n//\n\nimport Foundation\n\npublic enum ScriptVerification {\n    case StrictEncoding // enforce strict conformance to DER and SEC2 for signatures and pubkeys (aka SCRIPT_VERIFY_STRICTENC)\n    case EvenS // enforce lower S values (below curve halforder) in signatures (aka SCRIPT_VERIFY_EVEN_S, depends on STRICTENC)\n}\n\npublic enum ScriptMachineError: Error {\n    case exception(String)\n    case error(String)\n    case opcodeRequiresItemsOnStack(Int)\n    case invalidBignum\n}\n\n// ScriptMachine is a stack machine (like Forth) that evaluates a predicate\n// returning a bool indicating valid or not. There are no loops.\n// You can -copy a machine which will copy all the parameters and the stack state.\npublic struct ScriptMachine {\n\n    public init() { }\n\n    public static func verifyTransaction(signedTx: Transaction, inputIndex: UInt32, utxo: TransactionOutput, blockTimeStamp: UInt32 = UInt32(NSTimeIntervalSince1970)) throws -> Bool {\n        // Sanity check: transaction and its input should be consistent.\n        guard inputIndex < signedTx.inputs.count else {\n            throw ScriptMachineError.exception(\"Transaction and valid inputIndex are required for script verification.\")\n        }\n        let context: ScriptExecutionContext = ScriptExecutionContext(transaction: signedTx, utxoToVerify: utxo, inputIndex: inputIndex)!\n        context.blockTimeStamp = blockTimeStamp\n\n        let txInput: TransactionInput = signedTx.inputs[Int(inputIndex)]\n        guard let unlockScript = Script(data: txInput.signatureScript), let lockScript = Script(data: utxo.lockingScript) else {\n            throw ScriptMachineError.error(\"Both lock script and sig script must be valid.\")\n        }\n\n        return try verify(lockScript: lockScript, unlockScript: unlockScript, context: context)\n    }\n\n    public static func verify(lockScript: Script, unlockScript: Script, context: ScriptExecutionContext) throws -> Bool {\n        // First step: run the input script which typically places signatures, pubkeys and other static data needed for outputScript.\n        try run(unlockScript, context: context)\n\n        // Make a copy of the stack if we have P2SH script.\n        // We will run deserialized P2SH script on this stack.\n        let stackForP2SH: [Data] = context.stack\n\n        // Second step: run output script to see that the input satisfies all conditions laid in the output script.\n        try run(lockScript, context: context)\n\n        // We need to have something on stack\n        guard !context.stack.isEmpty else {\n            throw ScriptMachineError.error(\"Stack is empty after script execution.\")\n        }\n\n        // The last value must be true.\n        guard context.bool(at: -1) else {\n            throw ScriptMachineError.error(\"Last item on the stack is false.\")\n        }\n\n        // Additional validation for spend-to-script-hash transactions:\n        if context.shouldVerifyP2SH() && lockScript.isPayToScriptHashScript {\n            guard unlockScript.isDataOnly else {\n                throw ScriptMachineError.error(\"Input script for P2SH spending must be literals-only.\")\n            }\n            let deserializedLockScript = try context.deserializeP2SHLockScript(stackForP2SH: stackForP2SH)\n            try run(deserializedLockScript, context: context)\n\n            // We need to have something on stack\n            guard !context.stack.isEmpty else {\n                throw ScriptMachineError.error(\"Stack is empty after script execution.\")\n            }\n\n            // The last value must be YES.\n            guard context.bool(at: -1) else {\n                throw ScriptMachineError.error(\"Last item on the stack is false.\")\n            }\n        } else {\n            if context.verbose {\n                print(\"context.shouldVerifyP2SH : \", context.shouldVerifyP2SH(), \"isP2SH : \", lockScript.isPayToScriptHashScript)\n            }\n        }\n\n        // If nothing failed, validation passed.\n        return true\n    }\n\n    public static func run(_ script: Script, context: ScriptExecutionContext) throws {\n        guard script.data.count <= BTC_MAX_SCRIPT_SIZE else {\n            throw ScriptMachineError.exception(\"Script binary is too long.\")\n        }\n\n        // Altstack should be reset between script runs.\n        try script.execute(with: context)\n    }\n}\n\nprivate extension Array {\n    subscript (normalized index: Int) -> Element {\n        return (index < 0) ? self[count + index] : self[index]\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/ByteStream.swift",
    "content": "//\n//  ByteStream.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/6/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nclass ByteStream {\n    let data: Data\n    private var offset = 0\n    \n    var availableBytes: Int {\n        return data.count - offset\n    }\n    \n    init(_ data: Data) {\n        self.data = data\n    }\n    \n    func read<T>(_ type: T.Type) -> T {\n        let size = MemoryLayout<T>.size\n        let value = data[offset..<(offset + size)].to(type: type)\n        offset += size\n        return value\n    }\n    \n    func read(_ type: VarInt.Type) -> VarInt {\n        let len = data[offset..<(offset + 1)].to(type: UInt8.self)\n        let length: UInt64\n        switch len {\n        case 0...252:\n            length = UInt64(len)\n            offset += 1\n        case 0xfd:\n            offset += 1\n            length = UInt64(data[offset..<(offset + 2)].to(type: UInt16.self))\n            offset += 2\n        case 0xfe:\n            offset += 1\n            length = UInt64(data[offset..<(offset + 4)].to(type: UInt32.self))\n            offset += 4\n        case 0xff:\n            offset += 1\n            length = UInt64(data[offset..<(offset + 8)].to(type: UInt64.self))\n            offset += 8\n        default:\n            offset += 1\n            length = UInt64(data[offset..<(offset + 8)].to(type: UInt64.self))\n            offset += 8\n        }\n        return VarInt(length)\n    }\n    \n    func read(_ type: VarString.Type) -> VarString {\n        let length = read(VarInt.self).underlyingValue\n        let size = Int(length)\n        let value = data[offset..<(offset + size)].to(type: String.self)\n        offset += size\n        return VarString(value)\n    }\n    \n    func read(_ type: Data.Type, count: Int) -> Data {\n        let value = data[offset..<(offset + count)]\n        offset += count\n        return Data(value)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Converter/WeiEthterConverter.swift",
    "content": "//\n//  WeiEthterConverter.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 10/10/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic class  WeiEthterConverter {\n    \n    // NOTE: calculate wei by 10^18\n    private static let etherInWei = pow(Decimal(10), 18)\n    \n    /// Convert Wei(BInt) unit to Ether(Decimal) unit\n    public static func toEther(wei: Wei) throws -> Ether {\n        guard let decimalWei = Decimal(string: wei.description) else {\n            throw HDWalletKitError.convertError(.failedToConvert(wei.description))\n        }\n        return decimalWei / etherInWei\n    }\n    \n    /// Convert Ether(Decimal) unit to Wei(BInt) unit\n    public static func toWei(ether: Ether) throws -> Wei {\n        guard let wei = Wei((ether * etherInWei).description) else {\n            throw HDWalletKitError.convertError(.failedToConvert(ether * etherInWei))\n        }\n        return wei\n    }\n    \n    /// Convert Ether(String) unit to Wei(BInt) unit\n    public static func toWei(ether: String) throws -> Wei {\n        guard let decimalEther = Decimal(string: ether) else {\n            throw HDWalletKitError.convertError(.failedToConvert(ether))\n        }\n        return try toWei(ether: decimalEther)\n    }\n    \n    ///Convert Wei to Tokens balance\n    public static func toToken(balance: String, decimals: Int, radix: Int) throws -> Ether {\n        guard let wei = Wei(balance, radix: radix),\n              let  decimalWei = Decimal(string: wei.description) else {\n            throw HDWalletKitError.convertError(.failedToConvert(balance))\n        }\n        return decimalWei / pow(10, decimals)\n    }\n    \n    // Only used for calcurating gas price and gas limit.\n    public static func toWei(GWei: Int) -> Int {\n        return GWei * 1000000000\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Crypto/Encryption/Crypto.swift",
    "content": "//\n//  Crypto.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/02/06.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\n\nimport CryptoSwift\n\npublic final class Crypto {\n   public static func HMACSHA512(key: Data, data: Data) -> Data {\n        let output: [UInt8]\n        do {\n            output = try HMAC(key: key.bytes, variant: .sha512).authenticate(data.bytes)\n        } catch let error {\n            fatalError(\"Error occured. Description: \\(error.localizedDescription)\")\n        }\n        return Data(output)\n    }\n    \n    public static func PBKDF2SHA512(password: [UInt8], salt: [UInt8]) -> Data {\n        let output: [UInt8]\n        do {\n            output = try PKCS5.PBKDF2(password: password, salt: salt, iterations: 2048, variant: .sha512).calculate()\n        } catch let error {\n            fatalError(\"PKCS5.PBKDF2 faild: \\(error.localizedDescription)\")\n        }\n        return Data(output)\n    }\n    \n    public static func generatePublicKey(data: Data, compressed: Bool) -> Data {\n        let encrypter = EllipticCurveEncrypterSecp256k1()\n        var publicKey = encrypter.createPublicKey(privateKey: data)\n        return encrypter.export(publicKey: &publicKey, compressed: compressed)\n    }\n    \n    public static func sha3keccak256(data:Data) -> Data {\n        return Data(SHA3(variant: .keccak256).calculate(for: data.bytes))\n    }\n    \n    public static func hashSHA3_256(_ data: Data) -> Data {\n        return Data(CryptoSwift.SHA3(variant: .sha256).calculate(for: data.bytes))\n    }\n    \n    public static func sign(_ hash: Data, privateKey: Data) throws -> Data {\n        let encrypter = EllipticCurveEncrypterSecp256k1()\n        guard var signatureInInternalFormat = encrypter.sign(hash: hash, privateKey: privateKey) else {\n            throw HDWalletKitError.failedToSign\n        }\n        return encrypter.export(signature: &signatureInInternalFormat)\n    }\n    \n    public static func verifySigData(for tx: Transaction, inputIndex: Int, utxo: TransactionOutput, sigData: Data, pubKeyData: Data) throws -> Bool {\n        // Hash type is one byte tacked on to the end of the signature. So the signature shouldn't be empty.\n        guard !sigData.isEmpty else {\n            throw ScriptMachineError.error(\"SigData is empty.\")\n        }\n        // Extract hash type from the last byte of the signature.\n        let hashType = SighashType(sigData.last!)\n        // Strip that last byte to have a pure signature.\n        let signature = sigData.dropLast()\n        \n        let sighash: Data = tx.signatureHash(for: utxo, inputIndex: inputIndex, hashType: hashType)\n        \n        return try ECDSA.secp256k1.verifySignature(signature, message: sighash, publicKeyData: pubKeyData)\n    }\n}\n\n// MARK: SHA256 of SHA256\nextension Data {\n    var doubleSHA256: Data {\n        return sha256().sha256()\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Core/Crypto/Encryption/ECDSA.swift",
    "content": "//\n//  ECDSA.swift\n//  ECDSA\n//\n//  Created by yuzushioh on 2018/01/25.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\n\nimport Foundation\nimport secp256k1\n\npublic final class ECDSA {\n    public static let secp256k1 = ECDSA()\n    \n    public static func sign(_ data: Data, privateKey: Data) throws -> Data {\n        let ctx = secp256k1_context_create(UInt32(SECP256K1_CONTEXT_SIGN))!\n        defer { secp256k1_context_destroy(ctx) }\n        \n        let signature = UnsafeMutablePointer<secp256k1_ecdsa_signature>.allocate(capacity: 1)\n        defer { signature.deallocate() }\n\n        data.withUnsafeBytes { (ptr: UnsafeRawBufferPointer) in\n            guard let dataPointer = ptr.bindMemory(to: UInt8.self).baseAddress else { return }\n            privateKey.withUnsafeBytes { (pkPtr: UnsafeRawBufferPointer) in\n                guard let privateKeyPointer = pkPtr.bindMemory(to: UInt8.self).baseAddress else { return }\n                secp256k1_ecdsa_sign(ctx, signature, dataPointer, privateKeyPointer, nil, nil)\n            }\n        }\n        \n        let normalizedsig = UnsafeMutablePointer<secp256k1_ecdsa_signature>.allocate(capacity: 1)\n        defer { normalizedsig.deallocate() }\n        secp256k1_ecdsa_signature_normalize(ctx, normalizedsig, signature)\n        \n        var length: size_t = 128\n        var der = Data(count: length)\n        der.withUnsafeMutableBytes({ (ptr: UnsafeMutableRawBufferPointer) -> Void in\n            guard let pointer = ptr.bindMemory(to: UInt8.self).baseAddress else { return }\n            secp256k1_ecdsa_signature_serialize_der(ctx, pointer, &length, normalizedsig)\n        })\n        der.count = length\n        \n        return der\n    }\n    \n    public func verifySignature(_ sigData: Data, message: Data, publicKeyData: Data) throws -> Bool {\n        guard let ctx = secp256k1_context_create(UInt32(SECP256K1_CONTEXT_VERIFY)) else { return false }\n        var pubkey = secp256k1_pubkey()\n        var signature = secp256k1_ecdsa_signature()\n        secp256k1_ecdsa_signature_parse_der(ctx, &signature, sigData.bytes, sigData.count)\n        \n        if (secp256k1_ec_pubkey_parse(ctx, &pubkey, publicKeyData.bytes, publicKeyData.count) != 1) {\n            return false\n        };\n        \n        if (secp256k1_ecdsa_verify(ctx, &signature, message.bytes, &pubkey) != 1) {\n            return false\n        };\n        secp256k1_context_destroy(ctx);\n        return true\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Crypto/Encryption/EIP155Signer.swift",
    "content": "import CryptoSwift\n\npublic struct EIP155Signer {\n    \n    public init(chainId: Int) {\n        self.chainId = chainId\n    }\n    \n    private let chainId: Int\n    \n    public func sign(_ rawTransaction: EthereumRawTransaction, privateKey: PrivateKey) throws -> Data {\n        let transactionHash = try hash(rawTransaction: rawTransaction)\n        let signature = try privateKey.sign(hash: transactionHash)\n        return try signTransaction(signature: signature, rawTransaction: rawTransaction)\n    }\n    \n    public func sign(_ rawTransaction: EthereumRawTransaction, privateKey: Data) throws -> Data {\n        let transactionHash = try hash(rawTransaction: rawTransaction)\n        let signature = try Crypto.sign(transactionHash, privateKey: privateKey)\n        return try signTransaction(signature: signature, rawTransaction: rawTransaction)\n    }\n    \n    private func signTransaction(signature: Data, rawTransaction: EthereumRawTransaction) throws -> Data {\n        let (r, s, v) = calculateRSV(signature: signature)\n        return try RLP.encode([\n            rawTransaction.nonce,\n            rawTransaction.gasPrice,\n            rawTransaction.gasLimit,\n            rawTransaction.to.data,\n            rawTransaction.value,\n            rawTransaction.data,\n            v, r, s\n        ])\n    }\n    \n    public func hash(rawTransaction: EthereumRawTransaction) throws -> Data {\n        return Crypto.sha3keccak256(data: try encode(rawTransaction: rawTransaction))\n    }\n    \n    public func encode(rawTransaction: EthereumRawTransaction) throws -> Data {\n        var toEncode: [Any] = [\n            rawTransaction.nonce,\n            rawTransaction.gasPrice,\n            rawTransaction.gasLimit,\n            rawTransaction.to.data,\n            rawTransaction.value,\n            rawTransaction.data]\n        if chainId != 0 {\n            toEncode.append(contentsOf: [chainId, 0, 0 ]) // EIP155\n        }\n        return try RLP.encode(toEncode)\n    }\n    \n    public func calculateRSV(signature: Data) -> (r: BInt, s: BInt, v: BInt) {\n        return (\n            r: BInt(str: signature[..<32].toHexString(), radix: 16)!,\n            s: BInt(str: signature[32..<64].toHexString(), radix: 16)!,\n            v: BInt(signature[64]) + (chainId == 0 ? 27 : (35 + 2 * chainId))\n        )\n    }\n    \n    public func calculateSignature(r: BInt, s: BInt, v: BInt) -> Data {\n        let isOldSignitureScheme = [27, 28].contains(v)\n        let suffix = isOldSignitureScheme ? v - 27 : v - 35 - 2 * chainId\n        let sigHexStr = hex64Str(r) + hex64Str(s) + suffix.asString(withBase: 16)\n        return Data(hex: sigHexStr)\n    }\n    \n    private func hex64Str(_ i: BInt) -> String {\n        let hex = i.asString(withBase: 16)\n        return String(repeating: \"0\", count: 64 - hex.count) + hex\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Crypto/Encryption/EllipticCurveEncrypterSecp256k1.swift",
    "content": "//\n//  EllipticCurveEncrypterSecp256k1.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport secp256k1\nimport CryptoSwift\n\npublic class EllipticCurveEncrypterSecp256k1 {\n    // holds internal state of the c library\n    private let context: OpaquePointer\n    \n    public init() {\n        context = secp256k1_context_create(UInt32(SECP256K1_CONTEXT_SIGN | SECP256K1_CONTEXT_VERIFY))!\n    }\n    \n    deinit {\n        secp256k1_context_destroy(context)\n    }\n    \n    /// Recovers public key from the PrivateKey. Use import(signature:) to convert signature from bytes.\n    ///\n    /// - Parameters:\n    ///   - privateKey: private key bytes\n    /// - Returns: public key structure\n    public func createPublicKey(privateKey: Data) -> secp256k1_pubkey {\n        let privateKey = privateKey.bytes\n        var publickKey = secp256k1_pubkey()\n        _ = SecpResult(secp256k1_ec_pubkey_create(context, &publickKey, privateKey))\n        return publickKey\n    }\n    \n    /// Signs the hash with the private key. Produces signature data structure that can be exported with\n    /// export(signature:) method.\n    ///\n    /// - Parameters:\n    ///   - hash: 32-byte (256-bit) hash of the message\n    ///   - privateKey: 32-byte private key\n    /// - Returns: signature data structure if signing succeeded, otherwise nil.\n    public func sign(hash: Data, privateKey: Data) -> secp256k1_ecdsa_recoverable_signature? {\n        precondition(hash.count == 32, \"Hash must be 32 bytes size\")\n        var signature = secp256k1_ecdsa_recoverable_signature()\n        privateKey.withUnsafeBytes { privateKey -> Void in\n            guard let privateKeyPtr = privateKey.bindMemory(to: UInt8.self).baseAddress else { return }\n            hash.withUnsafeBytes { hash -> Void in\n                guard let hashPtr = hash.bindMemory(to: UInt8.self).baseAddress else { return }\n                secp256k1_ecdsa_sign_recoverable(context, &signature, hashPtr, privateKeyPtr, nil, nil)\n            }\n        }\n        return signature\n    }\n    \n    /// Converts signature data structure to 65 bytes.\n    ///\n    /// - Parameter signature: signature data structure\n    /// - Returns: 65 byte exported signature data.\n    public func export(signature: inout secp256k1_ecdsa_recoverable_signature) -> Data {\n        var output = Data(count: 65)\n        var recId = 0 as Int32\n        _ = output.withUnsafeMutableBytes { output in\n            guard let p = output.bindMemory(to: UInt8.self).baseAddress else { return }\n            secp256k1_ecdsa_recoverable_signature_serialize_compact(context, p, &recId, &signature)\n        }\n        \n        output[64] = UInt8(recId)\n        return output\n    }\n    \n    /// Converts serialized signature into library's signature format. Use it to supply signature to\n    /// the publicKey(signature:hash:) method.\n    ///\n    /// - Parameter signature: serialized 65-byte signature\n    /// - Returns: signature structure\n    public func `import`(signature: Data) -> secp256k1_ecdsa_recoverable_signature {\n        precondition(signature.count == 65, \"Signature must be 65 byte size\")\n        var sig = secp256k1_ecdsa_recoverable_signature()\n        let recId = Int32(signature[64])\n        signature.withUnsafeBytes { input -> Void in\n            guard let p = input.bindMemory(to: UInt8.self).baseAddress else { return }\n            secp256k1_ecdsa_recoverable_signature_parse_compact(context, &sig, p, recId)\n        }\n        return sig\n    }\n    \n    /// Recovers public key from the signature and the hash. Use import(signature:) to convert signature from bytes.\n    /// Use export(publicKey:compressed) to convert recovered public key into bytes.\n    ///\n    /// - Parameters:\n    ///   - signature: signature structure\n    ///   - hash: 32-byte (256-bit) hash of a message\n    /// - Returns: public key structure or nil, if signature invalid\n    public func publicKey(signature: inout secp256k1_ecdsa_recoverable_signature, hash: Data) -> secp256k1_pubkey? {\n        precondition(hash.count == 32, \"Hash must be 32 bytes size\")\n        let hash = hash.bytes\n        var outPubKey = secp256k1_pubkey()\n        let status = SecpResult(secp256k1_ecdsa_recover(context, &outPubKey, &signature, hash))\n        return status == .success ? outPubKey : nil\n    }\n    \n    /// Converts public key from library's data structure to bytes\n    ///\n    /// - Parameters:\n    ///   - publicKey: public key structure to convert.\n    ///   - compressed: whether public key should be compressed.\n    /// - Returns: If compression enabled, public key is 33 bytes size, otherwise it is 65 bytes.\n    public func export(publicKey: inout secp256k1_pubkey, compressed: Bool) -> Data {\n        var output = Data(count: compressed ? 33 : 65)\n        var outputLen: Int = output.count\n        let compressedFlags = compressed ? UInt32(SECP256K1_EC_COMPRESSED) : UInt32(SECP256K1_EC_UNCOMPRESSED)\n        output.withUnsafeMutableBytes { pointer -> Void in\n            guard let p = pointer.bindMemory(to: UInt8.self).baseAddress else { return }\n            secp256k1_ec_pubkey_serialize(context, p, &outputLen, &publicKey, compressedFlags)\n        }\n        return output\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Crypto/Encryption/SecpResult.swift",
    "content": "//\n//  SecpResult.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 13.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nenum SecpResult {\n    case success\n    case failure\n    \n    init(_ result:Int32) {\n        switch result {\n        case 1:\n            self = .success\n        default:\n            self = .failure\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Crypto/Hash/RIPEMD160.swift",
    "content": "//\n//  RIPEMD160.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/02/04.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\nimport Foundation\n\nstruct RIPEMD160 {\n    \n    private var MDbuf: (UInt32, UInt32, UInt32, UInt32, UInt32)\n    private var buffer: Data\n    private var count: Int64 // Total # of bytes processed.\n    \n    private init() {\n        MDbuf = (0x67452301, 0xefcdab89, 0x98badcfe, 0x10325476, 0xc3d2e1f0)\n        buffer = Data()\n        count = 0\n    }\n    \n    private mutating func compress(_ X: UnsafePointer<UInt32>) {\n        \n        // *** Helper functions (originally macros in rmd160.h) ***\n        \n        /* ROL(x, n) cyclically rotates x over n bits to the left */\n        /* x must be of an unsigned 32 bits type and 0 <= n < 32. */\n        func ROL(_ x: UInt32, _ n: UInt32) -> UInt32 {\n            return (x << n) | ( x >> (32 - n))\n        }\n        \n        /* the five basic functions F(), G() and H() */\n        \n        func F(_ x: UInt32, _ y: UInt32, _ z: UInt32) -> UInt32 {\n            return x ^ y ^ z\n        }\n        \n        func G(_ x: UInt32, _ y: UInt32, _ z: UInt32) -> UInt32 {\n            return (x & y) | (~x & z)\n        }\n        \n        func H(_ x: UInt32, _ y: UInt32, _ z: UInt32) -> UInt32 {\n            return (x | ~y) ^ z\n        }\n        \n        func I(_ x: UInt32, _ y: UInt32, _ z: UInt32) -> UInt32 {\n            return (x & z) | (y & ~z)\n        }\n        \n        func J(_ x: UInt32, _ y: UInt32, _ z: UInt32) -> UInt32 {\n            return x ^ (y | ~z)\n        }\n        \n        /* the ten basic operations FF() through III() */\n        \n        func FF(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ F(b, c, d) &+ x\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func GG(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ G(b, c, d) &+ x &+ 0x5a827999\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func HH(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ H(b, c, d) &+ x &+ 0x6ed9eba1\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func II(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ I(b, c, d) &+ x &+ 0x8f1bbcdc\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func JJ(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ J(b, c, d) &+ x &+ 0xa953fd4e\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func FFF(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ F(b, c, d) &+ x\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func GGG(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ G(b, c, d) &+ x &+ 0x7a6d76e9\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func HHH(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ H(b, c, d) &+ x &+ 0x6d703ef3\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func III(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ I(b, c, d) &+ x &+ 0x5c4dd124\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        func JJJ(_ a: inout UInt32, _ b: UInt32, _ c: inout UInt32, _ d: UInt32, _ e: UInt32, _ x: UInt32, _ s: UInt32) {\n            a = a &+ J(b, c, d) &+ x &+ 0x50a28be6\n            a = ROL(a, s) &+ e\n            c = ROL(c, 10)\n        }\n        \n        // *** The function starts here ***\n        \n        var (aa, bb, cc, dd, ee) = MDbuf\n        var (aaa, bbb, ccc, ddd, eee) = MDbuf\n        \n        /* round 1 */\n        FF(&aa, bb, &cc, dd, ee, X[ 0], 11)\n        FF(&ee, aa, &bb, cc, dd, X[ 1], 14)\n        FF(&dd, ee, &aa, bb, cc, X[ 2], 15)\n        FF(&cc, dd, &ee, aa, bb, X[ 3], 12)\n        FF(&bb, cc, &dd, ee, aa, X[ 4],  5)\n        FF(&aa, bb, &cc, dd, ee, X[ 5],  8)\n        FF(&ee, aa, &bb, cc, dd, X[ 6],  7)\n        FF(&dd, ee, &aa, bb, cc, X[ 7],  9)\n        FF(&cc, dd, &ee, aa, bb, X[ 8], 11)\n        FF(&bb, cc, &dd, ee, aa, X[ 9], 13)\n        FF(&aa, bb, &cc, dd, ee, X[10], 14)\n        FF(&ee, aa, &bb, cc, dd, X[11], 15)\n        FF(&dd, ee, &aa, bb, cc, X[12],  6)\n        FF(&cc, dd, &ee, aa, bb, X[13],  7)\n        FF(&bb, cc, &dd, ee, aa, X[14],  9)\n        FF(&aa, bb, &cc, dd, ee, X[15],  8)\n        \n        /* round 2 */\n        GG(&ee, aa, &bb, cc, dd, X[ 7],  7)\n        GG(&dd, ee, &aa, bb, cc, X[ 4],  6)\n        GG(&cc, dd, &ee, aa, bb, X[13],  8)\n        GG(&bb, cc, &dd, ee, aa, X[ 1], 13)\n        GG(&aa, bb, &cc, dd, ee, X[10], 11)\n        GG(&ee, aa, &bb, cc, dd, X[ 6],  9)\n        GG(&dd, ee, &aa, bb, cc, X[15],  7)\n        GG(&cc, dd, &ee, aa, bb, X[ 3], 15)\n        GG(&bb, cc, &dd, ee, aa, X[12],  7)\n        GG(&aa, bb, &cc, dd, ee, X[ 0], 12)\n        GG(&ee, aa, &bb, cc, dd, X[ 9], 15)\n        GG(&dd, ee, &aa, bb, cc, X[ 5],  9)\n        GG(&cc, dd, &ee, aa, bb, X[ 2], 11)\n        GG(&bb, cc, &dd, ee, aa, X[14],  7)\n        GG(&aa, bb, &cc, dd, ee, X[11], 13)\n        GG(&ee, aa, &bb, cc, dd, X[ 8], 12)\n        \n        /* round 3 */\n        HH(&dd, ee, &aa, bb, cc, X[ 3], 11)\n        HH(&cc, dd, &ee, aa, bb, X[10], 13)\n        HH(&bb, cc, &dd, ee, aa, X[14],  6)\n        HH(&aa, bb, &cc, dd, ee, X[ 4],  7)\n        HH(&ee, aa, &bb, cc, dd, X[ 9], 14)\n        HH(&dd, ee, &aa, bb, cc, X[15],  9)\n        HH(&cc, dd, &ee, aa, bb, X[ 8], 13)\n        HH(&bb, cc, &dd, ee, aa, X[ 1], 15)\n        HH(&aa, bb, &cc, dd, ee, X[ 2], 14)\n        HH(&ee, aa, &bb, cc, dd, X[ 7],  8)\n        HH(&dd, ee, &aa, bb, cc, X[ 0], 13)\n        HH(&cc, dd, &ee, aa, bb, X[ 6],  6)\n        HH(&bb, cc, &dd, ee, aa, X[13],  5)\n        HH(&aa, bb, &cc, dd, ee, X[11], 12)\n        HH(&ee, aa, &bb, cc, dd, X[ 5],  7)\n        HH(&dd, ee, &aa, bb, cc, X[12],  5)\n        \n        /* round 4 */\n        II(&cc, dd, &ee, aa, bb, X[ 1], 11)\n        II(&bb, cc, &dd, ee, aa, X[ 9], 12)\n        II(&aa, bb, &cc, dd, ee, X[11], 14)\n        II(&ee, aa, &bb, cc, dd, X[10], 15)\n        II(&dd, ee, &aa, bb, cc, X[ 0], 14)\n        II(&cc, dd, &ee, aa, bb, X[ 8], 15)\n        II(&bb, cc, &dd, ee, aa, X[12],  9)\n        II(&aa, bb, &cc, dd, ee, X[ 4],  8)\n        II(&ee, aa, &bb, cc, dd, X[13],  9)\n        II(&dd, ee, &aa, bb, cc, X[ 3], 14)\n        II(&cc, dd, &ee, aa, bb, X[ 7],  5)\n        II(&bb, cc, &dd, ee, aa, X[15],  6)\n        II(&aa, bb, &cc, dd, ee, X[14],  8)\n        II(&ee, aa, &bb, cc, dd, X[ 5],  6)\n        II(&dd, ee, &aa, bb, cc, X[ 6],  5)\n        II(&cc, dd, &ee, aa, bb, X[ 2], 12)\n        \n        /* round 5 */\n        JJ(&bb, cc, &dd, ee, aa, X[ 4],  9)\n        JJ(&aa, bb, &cc, dd, ee, X[ 0], 15)\n        JJ(&ee, aa, &bb, cc, dd, X[ 5],  5)\n        JJ(&dd, ee, &aa, bb, cc, X[ 9], 11)\n        JJ(&cc, dd, &ee, aa, bb, X[ 7],  6)\n        JJ(&bb, cc, &dd, ee, aa, X[12],  8)\n        JJ(&aa, bb, &cc, dd, ee, X[ 2], 13)\n        JJ(&ee, aa, &bb, cc, dd, X[10], 12)\n        JJ(&dd, ee, &aa, bb, cc, X[14],  5)\n        JJ(&cc, dd, &ee, aa, bb, X[ 1], 12)\n        JJ(&bb, cc, &dd, ee, aa, X[ 3], 13)\n        JJ(&aa, bb, &cc, dd, ee, X[ 8], 14)\n        JJ(&ee, aa, &bb, cc, dd, X[11], 11)\n        JJ(&dd, ee, &aa, bb, cc, X[ 6],  8)\n        JJ(&cc, dd, &ee, aa, bb, X[15],  5)\n        JJ(&bb, cc, &dd, ee, aa, X[13],  6)\n        \n        /* parallel round 1 */\n        JJJ(&aaa, bbb, &ccc, ddd, eee, X[ 5],  8)\n        JJJ(&eee, aaa, &bbb, ccc, ddd, X[14],  9)\n        JJJ(&ddd, eee, &aaa, bbb, ccc, X[ 7],  9)\n        JJJ(&ccc, ddd, &eee, aaa, bbb, X[ 0], 11)\n        JJJ(&bbb, ccc, &ddd, eee, aaa, X[ 9], 13)\n        JJJ(&aaa, bbb, &ccc, ddd, eee, X[ 2], 15)\n        JJJ(&eee, aaa, &bbb, ccc, ddd, X[11], 15)\n        JJJ(&ddd, eee, &aaa, bbb, ccc, X[ 4],  5)\n        JJJ(&ccc, ddd, &eee, aaa, bbb, X[13],  7)\n        JJJ(&bbb, ccc, &ddd, eee, aaa, X[ 6],  7)\n        JJJ(&aaa, bbb, &ccc, ddd, eee, X[15],  8)\n        JJJ(&eee, aaa, &bbb, ccc, ddd, X[ 8], 11)\n        JJJ(&ddd, eee, &aaa, bbb, ccc, X[ 1], 14)\n        JJJ(&ccc, ddd, &eee, aaa, bbb, X[10], 14)\n        JJJ(&bbb, ccc, &ddd, eee, aaa, X[ 3], 12)\n        JJJ(&aaa, bbb, &ccc, ddd, eee, X[12],  6)\n        \n        /* parallel round 2 */\n        III(&eee, aaa, &bbb, ccc, ddd, X[ 6],  9)\n        III(&ddd, eee, &aaa, bbb, ccc, X[11], 13)\n        III(&ccc, ddd, &eee, aaa, bbb, X[ 3], 15)\n        III(&bbb, ccc, &ddd, eee, aaa, X[ 7],  7)\n        III(&aaa, bbb, &ccc, ddd, eee, X[ 0], 12)\n        III(&eee, aaa, &bbb, ccc, ddd, X[13],  8)\n        III(&ddd, eee, &aaa, bbb, ccc, X[ 5],  9)\n        III(&ccc, ddd, &eee, aaa, bbb, X[10], 11)\n        III(&bbb, ccc, &ddd, eee, aaa, X[14],  7)\n        III(&aaa, bbb, &ccc, ddd, eee, X[15],  7)\n        III(&eee, aaa, &bbb, ccc, ddd, X[ 8], 12)\n        III(&ddd, eee, &aaa, bbb, ccc, X[12],  7)\n        III(&ccc, ddd, &eee, aaa, bbb, X[ 4],  6)\n        III(&bbb, ccc, &ddd, eee, aaa, X[ 9], 15)\n        III(&aaa, bbb, &ccc, ddd, eee, X[ 1], 13)\n        III(&eee, aaa, &bbb, ccc, ddd, X[ 2], 11)\n        \n        /* parallel round 3 */\n        HHH(&ddd, eee, &aaa, bbb, ccc, X[15],  9)\n        HHH(&ccc, ddd, &eee, aaa, bbb, X[ 5],  7)\n        HHH(&bbb, ccc, &ddd, eee, aaa, X[ 1], 15)\n        HHH(&aaa, bbb, &ccc, ddd, eee, X[ 3], 11)\n        HHH(&eee, aaa, &bbb, ccc, ddd, X[ 7],  8)\n        HHH(&ddd, eee, &aaa, bbb, ccc, X[14],  6)\n        HHH(&ccc, ddd, &eee, aaa, bbb, X[ 6],  6)\n        HHH(&bbb, ccc, &ddd, eee, aaa, X[ 9], 14)\n        HHH(&aaa, bbb, &ccc, ddd, eee, X[11], 12)\n        HHH(&eee, aaa, &bbb, ccc, ddd, X[ 8], 13)\n        HHH(&ddd, eee, &aaa, bbb, ccc, X[12],  5)\n        HHH(&ccc, ddd, &eee, aaa, bbb, X[ 2], 14)\n        HHH(&bbb, ccc, &ddd, eee, aaa, X[10], 13)\n        HHH(&aaa, bbb, &ccc, ddd, eee, X[ 0], 13)\n        HHH(&eee, aaa, &bbb, ccc, ddd, X[ 4],  7)\n        HHH(&ddd, eee, &aaa, bbb, ccc, X[13],  5)\n        \n        /* parallel round 4 */\n        GGG(&ccc, ddd, &eee, aaa, bbb, X[ 8], 15)\n        GGG(&bbb, ccc, &ddd, eee, aaa, X[ 6],  5)\n        GGG(&aaa, bbb, &ccc, ddd, eee, X[ 4],  8)\n        GGG(&eee, aaa, &bbb, ccc, ddd, X[ 1], 11)\n        GGG(&ddd, eee, &aaa, bbb, ccc, X[ 3], 14)\n        GGG(&ccc, ddd, &eee, aaa, bbb, X[11], 14)\n        GGG(&bbb, ccc, &ddd, eee, aaa, X[15],  6)\n        GGG(&aaa, bbb, &ccc, ddd, eee, X[ 0], 14)\n        GGG(&eee, aaa, &bbb, ccc, ddd, X[ 5],  6)\n        GGG(&ddd, eee, &aaa, bbb, ccc, X[12],  9)\n        GGG(&ccc, ddd, &eee, aaa, bbb, X[ 2], 12)\n        GGG(&bbb, ccc, &ddd, eee, aaa, X[13],  9)\n        GGG(&aaa, bbb, &ccc, ddd, eee, X[ 9], 12)\n        GGG(&eee, aaa, &bbb, ccc, ddd, X[ 7],  5)\n        GGG(&ddd, eee, &aaa, bbb, ccc, X[10], 15)\n        GGG(&ccc, ddd, &eee, aaa, bbb, X[14],  8)\n        \n        /* parallel round 5 */\n        FFF(&bbb, ccc, &ddd, eee, aaa, X[12] ,  8)\n        FFF(&aaa, bbb, &ccc, ddd, eee, X[15] ,  5)\n        FFF(&eee, aaa, &bbb, ccc, ddd, X[10] , 12)\n        FFF(&ddd, eee, &aaa, bbb, ccc, X[ 4] ,  9)\n        FFF(&ccc, ddd, &eee, aaa, bbb, X[ 1] , 12)\n        FFF(&bbb, ccc, &ddd, eee, aaa, X[ 5] ,  5)\n        FFF(&aaa, bbb, &ccc, ddd, eee, X[ 8] , 14)\n        FFF(&eee, aaa, &bbb, ccc, ddd, X[ 7] ,  6)\n        FFF(&ddd, eee, &aaa, bbb, ccc, X[ 6] ,  8)\n        FFF(&ccc, ddd, &eee, aaa, bbb, X[ 2] , 13)\n        FFF(&bbb, ccc, &ddd, eee, aaa, X[13] ,  6)\n        FFF(&aaa, bbb, &ccc, ddd, eee, X[14] ,  5)\n        FFF(&eee, aaa, &bbb, ccc, ddd, X[ 0] , 15)\n        FFF(&ddd, eee, &aaa, bbb, ccc, X[ 3] , 13)\n        FFF(&ccc, ddd, &eee, aaa, bbb, X[ 9] , 11)\n        FFF(&bbb, ccc, &ddd, eee, aaa, X[11] , 11)\n        \n        /* combine results */\n        MDbuf = (MDbuf.1 &+ cc &+ ddd,\n                 MDbuf.2 &+ dd &+ eee,\n                 MDbuf.3 &+ ee &+ aaa,\n                 MDbuf.4 &+ aa &+ bbb,\n                 MDbuf.0 &+ bb &+ ccc)\n    }\n    \n    mutating private func update(data: Data) {\n        data.withUnsafeBytes { (pointer) -> Void in\n            guard var ptr = pointer.baseAddress?.assumingMemoryBound(to: UInt8.self) else { return }\n            var length = data.count\n            var X = [UInt32](repeating: 0, count: 16)\n            \n            // Process remaining bytes from last call:\n            if buffer.count > 0 && buffer.count + length >= 64 {\n                let amount = 64 - buffer.count\n                buffer.append(ptr, count: amount)\n                buffer.withUnsafeBytes { _ = memcpy(&X, $0.baseAddress, 64) }\n                compress(X)\n                ptr += amount\n                length -= amount\n            }\n            // Process 64 byte chunks:\n            while length >= 64 {\n                memcpy(&X, ptr, 64)\n                compress(X)\n                ptr += 64\n                length -= 64\n            }\n            // Save remaining unprocessed bytes:\n            buffer = Data(bytes: ptr, count: length)\n        }\n        count += Int64(data.count)\n    }\n    \n    mutating private func finalize() -> Data {\n        var X = [UInt32](repeating: 0, count: 16)\n        /* append the bit m_n == 1 */\n        buffer.append(0x80)\n        buffer.withUnsafeBytes { _ = memcpy(&X, $0.baseAddress, buffer.count) }\n        \n        if (count & 63) > 55 {\n            /* length goes to next block */\n            compress(X)\n            X = [UInt32](repeating: 0, count: 16)\n        }\n        \n        /* append length in bits */\n        let lswlen = UInt32(truncatingIfNeeded: count)\n        let mswlen = UInt32(UInt64(count) >> 32)\n        X[14] = lswlen << 3\n        X[15] = (lswlen >> 29) | (mswlen << 3)\n        compress(X)\n        \n        var data = Data(count: 20)\n        data.withUnsafeMutableBytes { (pointer) -> Void in\n            let ptr = pointer.bindMemory(to: UInt32.self)\n            ptr[0] = MDbuf.0\n            ptr[1] = MDbuf.1\n            ptr[2] = MDbuf.2\n            ptr[3] = MDbuf.3\n            ptr[4] = MDbuf.4\n        }\n        \n        buffer = Data()\n        \n        return data\n    }\n}\n\nextension RIPEMD160 {\n    static func hash(_ message: Data) -> Data {\n        var md = RIPEMD160()\n        md.update(data: message)\n        return md.finalize()\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Core/DataConvertable.swift",
    "content": "//\n//  DataConvertable.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/02/11.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\n\nimport Foundation\n\nprotocol DataConvertable {\n    static func +(lhs: Data, rhs: Self) -> Data\n    static func +=(lhs: inout Data, rhs: Self)\n}\n\nextension DataConvertable {\n    static func +(lhs: Data, rhs: Self) -> Data {\n        var value = rhs\n        let data = Data(buffer: UnsafeBufferPointer(start: &value, count: 1))\n        return lhs + data\n    }\n    \n    static func +=(lhs: inout Data, rhs: Self) {\n        lhs = lhs + rhs\n    }\n}\n\nextension UInt8: DataConvertable {}\nextension UInt32: DataConvertable {}\n\n"
  },
  {
    "path": "HDWalletKit/Core/DerivationNode.swift",
    "content": "//\n//  DerivationNode.swift\n//  CryptoSwift\n//\n//  Created by Pavlo Boiko on 02.07.18.\n//\n\nimport Foundation\n\npublic enum DerivationNode {\n    case hardened(UInt32)\n    case notHardened(UInt32)\n    \n    public var index: UInt32 {\n        switch self {\n        case .hardened(let index):\n            return index\n        case .notHardened(let index):\n            return index\n        }\n    }\n    \n    public var hardens: Bool {\n        switch self {\n        case .hardened:\n            return true\n        case .notHardened:\n            return false\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Encodeing/Base58Encode.swift",
    "content": "//\n//  Base58Encode.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/02/11.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\n\nimport Foundation\nimport CryptoSwift\n\n// MARK: Base56Encode\n\n//public struct Base58 {\n//    private static let alphabet = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n//\n//    static func base58FromBytes(_ bytes: [UInt8]) -> String {\n//        var bytes = bytes\n//        var zerosCount = 0\n//        var length = 0\n//\n//        for b in bytes {\n//            if b != 0 { break }\n//            zerosCount += 1\n//        }\n//\n//        bytes.removeFirst(zerosCount)\n//\n//        let size = bytes.count * 138 / 100 + 1\n//\n//        var base58: [UInt8] = Array(repeating: 0, count: size)\n//        for b in bytes {\n//            var carry = Int(b)\n//            var i = 0\n//\n//            for j in 0...base58.count-1 where carry != 0 || i < length {\n//                carry += 256 * Int(base58[base58.count - j - 1])\n//                base58[base58.count - j - 1] = UInt8(carry % 58)\n//                carry /= 58\n//                i += 1\n//            }\n//\n//            assert(carry == 0)\n//\n//            length = i\n//        }\n//\n//        // skip leading zeros\n//        var zerosToRemove = 0\n//        var str = \"\"\n//        for b in base58 {\n//            if b != 0 { break }\n//            zerosToRemove += 1\n//        }\n//        base58.removeFirst(zerosToRemove)\n//\n//        while 0 < zerosCount {\n//            str = \"\\(str)1\"\n//            zerosCount -= 1\n//        }\n//\n//        for b in base58 {\n//            str = \"\\(str)\\(alphabet[String.Index(encodedOffset: Int(b))])\"\n//        }\n//\n//        return str\n//    }\n//\n//    // Decode\n//    static func bytesFromBase58(_ base58: String) -> [UInt8] {\n//        // remove leading and trailing whitespaces\n//        let string = base58.trimmingCharacters(in: CharacterSet.whitespaces)\n//\n//        guard !string.isEmpty else { return [] }\n//\n//        var zerosCount = 0\n//        var length = 0\n//        for c in string {\n//            if c != \"1\" { break }\n//            zerosCount += 1\n//        }\n//\n//        let size = string.lengthOfBytes(using: String.Encoding.utf8) * 733 / 1000 + 1 - zerosCount\n//        var base58: [UInt8] = Array(repeating: 0, count: size)\n//        for c in string where c != \" \" {\n//            // search for base58 character\n//            guard let base58Index = alphabet.index(of: c) else { return [] }\n//\n//            var carry = base58Index.encodedOffset\n//            var i = 0\n//            for j in 0...base58.count where carry != 0 || i < length {\n//                carry += 58 * Int(base58[base58.count - j - 1])\n//                base58[base58.count - j - 1] = UInt8(carry % 256)\n//                carry /= 256\n//                i += 1\n//            }\n//\n//            assert(carry == 0)\n//            length = i\n//        }\n//\n//        // skip leading zeros\n//        var zerosToRemove = 0\n//\n//        for b in base58 {\n//            if b != 0 { break }\n//            zerosToRemove += 1\n//        }\n//        base58.removeFirst(zerosToRemove)\n//\n//        var result: [UInt8] = Array(repeating: 0, count: zerosCount)\n//        for b in base58 {\n//            result.append(b)\n//        }\n//        return result\n//    }\n//}\n"
  },
  {
    "path": "HDWalletKit/Core/Encodeing/Bech32.swift",
    "content": "//\n//  Bech58.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/5/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nprivate protocol Encoding {\n    static var baseAlphabets: String { get }\n    static var zeroAlphabet: Character { get }\n    static var base: Int { get }\n    \n    // log(256) / log(base), rounded up\n    static func sizeFromByte(size: Int) -> Int\n    // log(base) / log(256), rounded up\n    static func sizeFromBase(size: Int) -> Int\n    \n    // Public\n    static func encode(_ bytes: Data) -> String\n    static func decode(_ string: String) -> Data\n}\n\nprivate struct _Base58: Encoding {\n    static let baseAlphabets = \"123456789ABCDEFGHJKLMNPQRSTUVWXYZabcdefghijkmnopqrstuvwxyz\"\n    static var zeroAlphabet: Character = \"1\"\n    static var base: Int = 58\n    \n    static func sizeFromByte(size: Int) -> Int {\n        return size * 138 / 100 + 1\n    }\n    static func sizeFromBase(size: Int) -> Int {\n        return size * 733 / 1000 + 1\n    }\n}\n\npublic struct Base58 {\n    public static func encode(_ bytes: Data) -> String {\n        return _Base58.encode(bytes)\n    }\n    public static func decode(_ string: String) -> Data? {\n        return _Base58.decode(string)\n    }\n}\n\n// The Base encoding used is home made, and has some differences. Especially,\n// leading zeros are kept as single zeros when conversion happens.\nextension Encoding {\n    static func convertBytesToBase(_ bytes: Data) -> [UInt8] {\n        var length = 0\n        let size = sizeFromByte(size: bytes.count)\n        var encodedBytes: [UInt8] = Array(repeating: 0, count: size)\n        \n        for b in bytes {\n            var carry = Int(b)\n            var i = 0\n            for j in (0...encodedBytes.count - 1).reversed() where carry != 0 || i < length {\n                carry += 256 * Int(encodedBytes[j])\n                encodedBytes[j] = UInt8(carry % base)\n                carry /= base\n                i += 1\n            }\n            \n            assert(carry == 0)\n            \n            length = i\n        }\n        \n        var zerosToRemove = 0\n        for b in encodedBytes {\n            if b != 0 { break }\n            zerosToRemove += 1\n        }\n        \n        encodedBytes.removeFirst(zerosToRemove)\n        return encodedBytes\n    }\n    \n    static func encode(_ bytes: Data) -> String {\n        var bytes = bytes\n        var zerosCount = 0\n        \n        for b in bytes {\n            if b != 0 { break }\n            zerosCount += 1\n        }\n        \n        bytes.removeFirst(zerosCount)\n        \n        let encodedBytes = convertBytesToBase(bytes)\n        \n        var str = \"\"\n        while 0 < zerosCount {\n            str += String(zeroAlphabet)\n            zerosCount -= 1\n        }\n        \n        for b in encodedBytes {\n            str += String(baseAlphabets[String.Index(utf16Offset: Int(b), in: baseAlphabets)])\n        }\n        \n        return str\n    }\n    \n    static func decode(_ string: String) -> Data {\n        guard !string.isEmpty else { return Data() }\n        \n        var zerosCount = 0\n        var length = 0\n        for c in string {\n            if c != zeroAlphabet { break }\n            zerosCount += 1\n        }\n        let size = sizeFromBase(size: string.lengthOfBytes(using: .utf8) - zerosCount)\n        var decodedBytes: [UInt8] = Array(repeating: 0, count: size)\n        for c in string {\n            guard let baseIndex = baseAlphabets.firstIndex(of: c) else { return Data() }\n            \n            var carry = baseIndex.utf16Offset(in: baseAlphabets)\n            var i = 0\n            for j in (0...decodedBytes.count - 1).reversed() where carry != 0 || i < length {\n                carry += base * Int(decodedBytes[j])\n                decodedBytes[j] = UInt8(carry % 256)\n                carry /= 256\n                i += 1\n            }\n            \n            assert(carry == 0)\n            length = i\n        }\n        \n        // skip leading zeros\n        var zerosToRemove = 0\n        \n        for b in decodedBytes {\n            if b != 0 { break }\n            zerosToRemove += 1\n        }\n        decodedBytes.removeFirst(zerosToRemove)\n        \n        return Data(repeating: 0, count: zerosCount) + Data(decodedBytes)\n    }\n}\n\npublic struct Bech32 {\n    private static let base32Alphabets = \"qpzry9x8gf2tvdw0s3jn54khce6mua7l\"\n    \n    public static func encode(_ bytes: Data, prefix: String, seperator: String = \":\") -> String {\n        let payload = convertTo5bit(data: bytes, pad: true)\n        let checksum: Data = createChecksum(prefix: prefix, payload: payload) // Data of [UInt5]\n        let combined: Data = payload + checksum // Data of [UInt5]\n        var base32 = \"\"\n        for b in combined {\n            base32 += String(base32Alphabets[String.Index(utf16Offset: Int(b), in: base32Alphabets)])\n        }\n        \n        return prefix + seperator + base32\n    }\n    \n    // string : \"bitcoincash:qql8zpwglr3q5le9jnjxkmypefaku39dkygsx29fzk\"\n    public static func decode(_ string: String, seperator: String = \":\") -> (prefix: String, data: Data)? {\n        // We can't have empty string.\n        // Bech32 should be uppercase only / lowercase only.\n        guard !string.isEmpty && [string.lowercased(), string.uppercased()].contains(string) else {\n            return nil\n        }\n        \n        let components = string.components(separatedBy: seperator)\n        // We can only handle string contains both scheme and base32\n        guard components.count == 2 else {\n            return nil\n        }\n        let (prefix, base32) = (components[0], components[1])\n        \n        var decodedIn5bit: [UInt8] = [UInt8]()\n        for c in base32.lowercased() {\n            // We can't have characters other than base32 alphabets.\n            guard let baseIndex = base32Alphabets.firstIndex(of: c)?.utf16Offset(in: base32Alphabets) else {\n                return nil\n            }\n            decodedIn5bit.append(UInt8(baseIndex))\n        }\n        \n        // We can't have invalid checksum\n        let payload = Data(decodedIn5bit)\n        guard verifyChecksum(prefix: prefix, payload: payload) else {\n            return nil\n        }\n        \n        // Drop checksum\n        guard let bytes = try? convertFrom5bit(data: payload.dropLast(8)) else {\n            return nil\n        }\n        return (prefix, Data(bytes))\n    }\n    \n    private static func verifyChecksum(prefix: String, payload: Data) -> Bool {\n        return PolyMod(expand(prefix) + payload) == 0\n    }\n    \n    private static func expand(_ prefix: String) -> Data {\n        var ret: Data = Data()\n        let buf: [UInt8] = Array(prefix.utf8)\n        for b in buf {\n            ret += b & 0x1f\n        }\n        ret += Data(repeating: 0, count: 1)\n        return ret\n    }\n    \n    private static func createChecksum(prefix: String, payload: Data) -> Data {\n        let enc: Data = expand(prefix) + payload + Data(repeating: 0, count: 8)\n        let mod: UInt64 = PolyMod(enc)\n        var ret: Data = Data()\n        for i in 0..<8 {\n            ret += UInt8((mod >> (5 * (7 - i))) & 0x1f)\n        }\n        return ret\n    }\n    \n    private static func PolyMod(_ data: Data) -> UInt64 {\n        var c: UInt64 = 1\n        for d in data {\n            let c0: UInt8 = UInt8(c >> 35)\n            c = ((c & 0x07ffffffff) << 5) ^ UInt64(d)\n            if c0 & 0x01 != 0 { c ^= 0x98f2bc8e61 }\n            if c0 & 0x02 != 0 { c ^= 0x79b76d99e2 }\n            if c0 & 0x04 != 0 { c ^= 0xf33e5fb3c4 }\n            if c0 & 0x08 != 0 { c ^= 0xae2eabe2a8 }\n            if c0 & 0x10 != 0 { c ^= 0x1e4f43e470 }\n        }\n        return c ^ 1\n    }\n    \n    private static func convertTo5bit(data: Data, pad: Bool) -> Data {\n        var acc = Int()\n        var bits = UInt8()\n        let maxv: Int = 31 // 31 = 0x1f = 00011111\n        var converted: [UInt8] = []\n        for d in data {\n            acc = (acc << 8) | Int(d)\n            bits += 8\n            \n            while bits >= 5 {\n                bits -= 5\n                converted.append(UInt8(acc >> Int(bits) & maxv))\n            }\n        }\n        \n        let lastBits: UInt8 = UInt8(acc << (5 - bits) & maxv)\n        if pad && bits > 0 {\n            converted.append(lastBits)\n        }\n        return Data(converted)\n    }\n    \n    internal static func convertFrom5bit(data: Data) throws -> Data {\n        var acc = Int()\n        var bits = UInt8()\n        let maxv: Int = 255 // 255 = 0xff = 11111111\u0010\n        var converted: [UInt8] = []\n        for d in data {\n            guard (d >> 5) == 0 else {\n                throw DecodeError.invalidCharacter\n            }\n            acc = (acc << 5) | Int(d)\n            bits += 5\n            \n            while bits >= 8 {\n                bits -= 8\n                converted.append(UInt8(acc >> Int(bits) & maxv))\n            }\n        }\n        \n        let lastBits: UInt8 = UInt8(acc << (8 - bits) & maxv)\n        guard bits < 5 && lastBits == 0  else {\n            throw DecodeError.invalidBits\n        }\n        \n        return Data(converted)\n    }\n    \n    private enum DecodeError: Error {\n        case invalidCharacter\n        case invalidBits\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Core/Encodeing/EIP55.swift",
    "content": "//\n//  EIP55.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 28.06.18.\n//\n\nimport CryptoSwift\n\n// NOTE: https://github.com/ethereum/EIPs/blob/master/EIPS/eip-55.md\npublic struct EIP55 {\n    public static func encode(_ data: Data) -> String {\n        let address = data.toHexString()\n        \n        let hash = Crypto.sha3keccak256(data: address.data(using: .ascii)!).toHexString()\n        \n        return zip(address, hash)\n            .map { a, h -> String in\n                switch (a, h) {\n                case (\"0\", _), (\"1\", _), (\"2\", _), (\"3\", _), (\"4\", _), (\"5\", _), (\"6\", _), (\"7\", _), (\"8\", _), (\"9\", _):\n                    return String(a)\n                case (_, \"8\"), (_, \"9\"), (_, \"a\"), (_, \"b\"), (_, \"c\"), (_, \"d\"), (_, \"e\"), (_, \"f\"):\n                    return String(a).uppercased()\n                default:\n                    return String(a).lowercased()\n                }\n            }\n            .joined()\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Core/Encodeing/RLP.swift",
    "content": "import Foundation\n\npublic struct RLP {\n    public static func encode(_ element: Any) throws -> Data {\n        let encoded: Data?\n        switch element {\n        case let list as [Any]:\n            encoded = try encode(elements: list)\n        case let bint as BInt:\n            encoded = encode(bint: bint)\n        case let int as Int:\n            encoded = encode(bint: BInt(int))\n        case let data as Data:\n            encoded = encode(data: data)\n        case let string as String:\n            encoded = encode(string: string)\n        default:\n            encoded = nil\n        }\n        guard let data = encoded else {\n            throw HDWalletKitError.cryptoError(.failedToEncode(element: element))\n        }\n        return data\n    }\n    \n    private static func encode(data: Data) -> Data {\n        if data.count == 1 && data[0] <= 0x7f {\n            return data\n        }\n        var encoded = encodeHeader(size: UInt64(data.count), smallTag: 0x80, largeTag: 0xb7)\n        encoded.append(data)\n        return encoded\n    }\n    \n    private static func encode(string: String) -> Data? {\n        guard let data = string.data(using: .utf8) else {\n            return nil\n        }\n        return encode(data: data)\n    }\n    \n    private static func encode(bint: BInt) -> Data? {\n        let data = bint.serialize()\n        if data.isEmpty {\n            return Data([0x80])\n        }\n        return encode(data: data)\n    }\n    \n    private static func encode(elements: [Any]) throws -> Data? {\n        var data = Data()\n        for element in elements {\n            data.append(try encode(element))\n        }\n        \n        var encodedData = encodeHeader(size: UInt64(data.count), smallTag: 0xc0, largeTag: 0xf7)\n        encodedData.append(data)\n        return encodedData\n    }\n    \n    private static func encodeHeader(size: UInt64, smallTag: UInt8, largeTag: UInt8) -> Data {\n        if size < 56 {\n            return Data([smallTag + UInt8(size)])\n        }\n        \n        let sizeData = putint(size)\n        var encoded = Data()\n        encoded.append(largeTag + UInt8(sizeData.count))\n        encoded.append(contentsOf: sizeData)\n        return encoded\n    }\n    \n    private static func putint(_ i: UInt64) -> Data {\n        switch i {\n        case 0 ..< (1 << 8):\n            return Data([UInt8(i)])\n        case 0 ..< (1 << 16):\n            return Data([\n                UInt8(i >> 8),\n                UInt8(truncatingIfNeeded: i)\n                ])\n        case 0 ..< (1 << 24):\n            return Data([\n                UInt8(i >> 16),\n                UInt8(truncatingIfNeeded: i >> 8),\n                UInt8(truncatingIfNeeded: i)\n                ])\n        case 0 ..< (1 << 32):\n            return Data([\n                UInt8(i >> 24),\n                UInt8(truncatingIfNeeded: i >> 16),\n                UInt8(truncatingIfNeeded: i >> 8),\n                UInt8(truncatingIfNeeded: i)\n                ])\n        case 0 ..< (1 << 40):\n            return Data([\n                UInt8(i >> 32),\n                UInt8(truncatingIfNeeded: i >> 24),\n                UInt8(truncatingIfNeeded: i >> 16),\n                UInt8(truncatingIfNeeded: i >> 8),\n                UInt8(truncatingIfNeeded: i)\n                ])\n        case 0 ..< (1 << 48):\n            return Data([\n                UInt8(i >> 40),\n                UInt8(truncatingIfNeeded: i >> 32),\n                UInt8(truncatingIfNeeded: i >> 24),\n                UInt8(truncatingIfNeeded: i >> 16),\n                UInt8(truncatingIfNeeded: i >> 8),\n                UInt8(truncatingIfNeeded: i)\n                ])\n        case 0 ..< (1 << 56):\n            return Data([\n                UInt8(i >> 48),\n                UInt8(truncatingIfNeeded: i >> 40),\n                UInt8(truncatingIfNeeded: i >> 32),\n                UInt8(truncatingIfNeeded: i >> 24),\n                UInt8(truncatingIfNeeded: i >> 16),\n                UInt8(truncatingIfNeeded: i >> 8),\n                UInt8(truncatingIfNeeded: i)\n                ])\n        default:\n            return Data([\n                UInt8(i >> 56),\n                UInt8(truncatingIfNeeded: i >> 48),\n                UInt8(truncatingIfNeeded: i >> 40),\n                UInt8(truncatingIfNeeded: i >> 32),\n                UInt8(truncatingIfNeeded: i >> 24),\n                UInt8(truncatingIfNeeded: i >> 16),\n                UInt8(truncatingIfNeeded: i >> 8),\n                UInt8(truncatingIfNeeded: i)\n            ])\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Error/HDWalletKitError.swift",
    "content": "//\n//  HDWalletKitError.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic enum HDWalletKitError: Error {\n    public enum CryptoError {\n        case failedToEncode(element:Any)\n    }\n    \n    public enum ContractError: Error {\n        case containsInvalidCharactor(Any)\n        case invalidDecimalValue(Any)\n    }\n    \n    public enum ConvertError: Error {\n        case failedToConvert(Any)\n    }\n    \n    case cryptoError(CryptoError)\n    case contractError(ContractError)\n    case convertError(ConvertError)\n    case failedToSign\n    case noEnoughSpace\n    case unknownError\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Extensions/Data+Random.swift",
    "content": "//\n//  Data+Random.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 20.08.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nextension Data {\n    static func randomBytes(length: Int) -> Data {\n        var bytes = Data(count: length)\n        _ = bytes.withUnsafeMutableBytes { SecRandomCopyBytes(kSecRandomDefault, length, $0.baseAddress!) }\n        return bytes\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Extensions/Data+Script.swift",
    "content": "//\n//  Data+Script.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/4/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\n// swiftlint:disable shorthand_operator\n// swiftlint:disable operator_whitespace\n\nprotocol BinaryConvertible {\n    static func +(lhs: Data, rhs: Self) -> Data\n    static func +=(lhs: inout Data, rhs: Self)\n}\n\nextension BinaryConvertible {\n    static func +(lhs: Data, rhs: Self) -> Data {\n        var value = rhs\n        let data = Data(buffer: UnsafeBufferPointer(start: &value, count: 1))\n        return lhs + data\n    }\n    \n    static func +=(lhs: inout Data, rhs: Self) {\n        lhs = lhs + rhs\n    }\n}\n\nextension UInt16: BinaryConvertible {}\nextension UInt64: BinaryConvertible {}\nextension Int8: BinaryConvertible {}\nextension Int16: BinaryConvertible {}\nextension Int32: BinaryConvertible {}\nextension Int64: BinaryConvertible {}\nextension Int: BinaryConvertible {}\n\nextension Bool: BinaryConvertible {\n    static func +(lhs: Data, rhs: Bool) -> Data {\n        return lhs + (rhs ? UInt8(0x01) : UInt8(0x00)).littleEndian\n    }\n}\n\nextension String: BinaryConvertible {\n    static func +(lhs: Data, rhs: String) -> Data {\n        guard let data = rhs.data(using: .ascii) else { return lhs }\n        return lhs + data\n    }\n}\n\nfunc +(lhs: Data, rhs: OpCodeProtocol) -> Data {\n    return lhs + rhs.value\n}\nfunc += (lhs: inout Data, rhs: OpCodeProtocol) {\n    lhs = lhs + rhs\n}\n\nextension Data: BinaryConvertible {\n    static func +(lhs: Data, rhs: Data) -> Data {\n        var data = Data()\n        data.append(lhs)\n        data.append(rhs)\n        return data\n    }\n}\n\nextension Data {\n    init<T>(from value: T) {\n        var value = value\n        self.init(buffer: UnsafeBufferPointer(start: &value, count: 1))\n    }\n    \n    func to<T>(type: T.Type) -> T {\n        return self.withUnsafeBytes { (ptr) -> T in\n            return ptr.baseAddress!.assumingMemoryBound(to: T.self).pointee\n        }\n    }\n    \n    func to(type: String.Type) -> String {\n        return String(bytes: self, encoding: .ascii)!.replacingOccurrences(of: \"\\0\", with: \"\")\n    }\n    \n    func to(type: VarInt.Type) -> VarInt {\n        let value: UInt64\n        let length = self[0..<1].to(type: UInt8.self)\n        switch length {\n        case 0...252:\n            value = UInt64(length)\n        case 0xfd:\n            value = UInt64(self[1...2].to(type: UInt16.self))\n        case 0xfe:\n            value = UInt64(self[1...4].to(type: UInt32.self))\n        case 0xff:\n            fallthrough\n        default:\n            value = self[1...8].to(type: UInt64.self)\n        }\n        return VarInt(value)\n    }\n}\n\nextension Data {\n    public var hex: String {\n        return reduce(\"\") { $0 + String(format: \"%02x\", $1) }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Extensions/String+Hex.swift",
    "content": "//\n//  String+Hex.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nfileprivate var hexPrefix = \"0x\"\n\nextension String {\n    \n    public func stripHexPrefix() -> String {\n        var hex = self\n        if hex.hasPrefix(hexPrefix) {\n            hex = String(hex.dropFirst(hexPrefix.count))\n        }\n        return hex\n    }\n    \n    public func addHexPrefix() -> String {\n        return hexPrefix.appending(self)\n    }\n    \n    public func toHexString() -> String {\n        guard let data = data(using: .utf8) else {\n            return \"\"\n        }\n        return data.toHexString()\n    }\n}\n\nextension Data {\n    public func dataToHexString() -> String {\n        return map { String(format: \"%02x\", $0) }.joined()\n    }\n    \n    public static func fromHex(_ hex: String) -> Data? {\n        let string = hex.lowercased().stripHexPrefix()\n        let array = Array<UInt8>(hex: string)\n        if (array.count == 0) {\n            if (hex == \"0x\" || hex == \"\") {\n                return Data()\n            } else {\n                return nil\n            }\n        }\n        return Data(array)\n    }\n    \n    public func constantTimeComparisonTo(_ other:Data?) -> Bool {\n        guard let rhs = other else {return false}\n        guard self.count == rhs.count else {return false}\n        var difference = UInt8(0x00)\n        for i in 0..<self.count { // compare full length\n            difference |= self[i] ^ rhs[i] //constant time\n        }\n        return difference == UInt8(0x00)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/Typealiaces.swift",
    "content": "//\n//  Typealiaces.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic typealias Wei = BInt\npublic typealias Ether = Decimal\n"
  },
  {
    "path": "HDWalletKit/Core/VarInt.swift",
    "content": "//\n//  VarInt.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/6/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct VarInt: ExpressibleByIntegerLiteral {\n    public typealias IntegerLiteralType = UInt64\n    public let underlyingValue: UInt64\n    let length: UInt8\n    let data: Data\n    \n    public init(integerLiteral value: UInt64) {\n        self.init(value)\n    }\n    \n    /*\n     0xfc : 252\n     0xfd : 253\n     0xfe : 254\n     0xff : 255\n     \n     0~252 : 1-byte(0x00 ~ 0xfc)\n     253 ~ 65535: 3-byte(0xfd00fd ~ 0xfdffff)\n     65536 ~ 4294967295 : 5-byte(0xfe010000 ~ 0xfeffffffff)\n     4294967296 ~ 1.84467441e19 : 9-byte(0xff0000000100000000 ~ 0xfeffffffffffffffff)\n     */\n    public init(_ value: UInt64) {\n        underlyingValue = value\n        \n        switch value {\n        case 0...252:\n            length = 1\n            data = Data() + UInt8(value).littleEndian\n        case 253...0xffff:\n            length = 2\n            data = Data() + UInt8(0xfd).littleEndian + UInt16(value).littleEndian\n        case 0x10000...0xffffffff:\n            length = 4\n            data = Data() + UInt8(0xfe).littleEndian + UInt32(value).littleEndian\n        case 0x100000000...0xffffffffffffffff:\n            fallthrough\n        default:\n            length = 8\n            data = Data() + UInt8(0xff).littleEndian + UInt64(value).littleEndian\n        }\n    }\n    \n    public init(_ value: Int) {\n        self.init(UInt64(value))\n    }\n    \n    public func serialized() -> Data {\n        return data\n    }\n    \n    public static func deserialize(_ data: Data) -> VarInt {\n        return data.to(type: self)\n    }\n}\n\nextension VarInt: CustomStringConvertible {\n    public var description: String {\n        return \"\\(underlyingValue)\"\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Core/VarString.swift",
    "content": "//\n//  VarString.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/6/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\n/// Variable length string can be stored using a variable length integer followed by the string itself.\npublic struct VarString: ExpressibleByStringLiteral {\n    public typealias StringLiteralType = String\n    public let length: VarInt\n    public let value: String\n    \n    public init(stringLiteral value: String) {\n        self.init(value)\n    }\n    \n    public init(_ value: String) {\n        self.value = value\n        length = VarInt(value.data(using: .ascii)!.count)\n    }\n    \n    public func serialized() -> Data {\n        var data = Data()\n        data += length.serialized()\n        data += value\n        return data\n    }\n}\n\nextension VarString: CustomStringConvertible {\n    public var description: String {\n        return \"\\(value)\"\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Keystore/KeystoreInterface.swift",
    "content": "//\n//  KeystoreInterface.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 20.08.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic enum KeystoreError: Error {\n    case keyDerivationError\n    case aesError\n}\n\nprotocol KeystoreInterface {\n    func getDecriptedKeyStore(passwordData: Data) throws -> Data?\n    func encodedData() throws -> Data\n    init? (data: Data, passwordData: Data) throws\n    init? (keyStore: Data) throws\n\n    init? (data: Data, password: String) throws\n    func getDecriptedKeyStore(password: String) throws -> Data?\n}\n"
  },
  {
    "path": "HDWalletKit/Keystore/KeystoreV3.swift",
    "content": "//\n//  KeystoreV3.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 20.08.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\nimport CryptoSwift\n\npublic class KeystoreV3: KeystoreInterface {\n    @available(*, deprecated)\n    /// Init with raw pasword\n    /// We will automaticaly hash password to sha3-keccak256\n    ///\n    required public convenience init?(data: Data, password: String) throws {\n        guard let passwordData = password.data(using: .utf8)?.sha3(.keccak256) else { return nil }\n        try self.init(data: data, passwordData: passwordData)\n    }\n    \n    \n    /// Init with encoded pasword\n    ///\n    public required init? (data: Data, passwordData: Data) throws {\n        try encryptDataToStorage(passwordData, data: data)\n    }\n    \n    public required init? (keyStore: Data) throws {\n        keystoreParams = try JSONDecoder().decode(KeystoreParamsV3.self, from: keyStore)\n    }\n    \n    public var keystoreParams: KeystoreParamsV3?\n\n    \n    public func encodedData() throws -> Data {\n        return try JSONEncoder().encode(keystoreParams)\n    }\n    \n    @available(*, deprecated)\n    /// Decode keystore with password\n    /// We will automaticaly hash password to sha3-keccak256\n    ///\n    /// - Parameter password: raw password\n    /// - Returns: decripted keystore value\n    /// - Throws: wrong password error\n    func getDecriptedKeyStore(password: String) throws -> Data? {\n        guard let passwordData = password.data(using: .utf8)?.sha3(.keccak256) else { return nil }\n        return try getDecriptedKeyStore(passwordData: passwordData)\n    }\n    \n    /// Decode keystore with password\n    ///\n    /// - Parameter password: encoded password\n    /// - Returns: decripted keystore value\n    /// - Throws: wrong password error\n    public func getDecriptedKeyStore(passwordData: Data) throws -> Data? {\n        guard let keystoreParams = self.keystoreParams else {return nil}\n        guard let saltData = Data.fromHex(keystoreParams.crypto.kdfparams.salt) else {return nil}\n        let derivedLen = keystoreParams.crypto.kdfparams.dklen\n        guard let N = keystoreParams.crypto.kdfparams.n else {return nil}\n        guard let P = keystoreParams.crypto.kdfparams.p else {return nil}\n        guard let R = keystoreParams.crypto.kdfparams.r else {return nil}\n        guard let derivedKey = encryptData(passwordData: passwordData,\n                                           salt: saltData,\n                                           length: derivedLen,\n                                           N: N,\n                                           R: R,\n                                           P: P) else {return nil}\n        var dataForMAC = Data()\n        let derivedKeyLast16bytes = Data(derivedKey[(derivedKey.count - 16)...(derivedKey.count - 1)])\n        dataForMAC.append(derivedKeyLast16bytes)\n        guard let cipherText = Data.fromHex(keystoreParams.crypto.ciphertext) else {return nil}\n        dataForMAC.append(cipherText)\n        let mac = dataForMAC.sha3(.keccak256)\n        guard let calculatedMac = Data.fromHex(keystoreParams.crypto.mac),\n            mac.constantTimeComparisonTo(calculatedMac) else {return nil}\n        let decryptionKey = derivedKey[0...15]\n        guard let IV = Data.fromHex(keystoreParams.crypto.cipherparams.iv) else {return nil}\n        guard let aesCipher = try? AES(key: decryptionKey.bytes, blockMode: CTR(iv: IV.bytes), padding: .noPadding) else {return nil}\n        guard let decryptedPK:Array<UInt8> = try? aesCipher.decrypt(cipherText.bytes) else { return nil }\n        return Data(decryptedPK)\n    }\n    \n    private func encryptData(passwordData: Data, salt: Data, length: Int, N: Int, R: Int, P: Int) -> Data? {\n        guard let deriver = try? Scrypt(password: passwordData.bytes, salt: salt.bytes, dkLen: length, N: N, r: R, p: P) else {return nil}\n        guard let result = try? deriver.calculate() else {return nil}\n        return Data(result)\n    }\n    \n    private func encryptDataToStorage(_ passwordData: Data, data: Data, dkLen: Int=32, N: Int = 1024, R: Int = 8, P: Int = 1) throws {\n        let saltLen = 32;\n        let saltData = Data.randomBytes(length: saltLen)\n        guard let derivedKey = encryptData(passwordData: passwordData,\n                                           salt: saltData,\n                                           length: dkLen,\n                                           N: N,\n                                           R: R,\n                                           P: P) else {throw KeystoreError.keyDerivationError}\n        let last16bytes = Data(derivedKey[(derivedKey.count - 16)...(derivedKey.count-1)])\n        let encryptionKey = Data(derivedKey[0...15])\n        let IV = Data.randomBytes(length: 16)\n        let aesCipher = try? AES(key: encryptionKey.bytes, blockMode: CTR(iv: IV.bytes), padding: .noPadding)\n        guard let encryptedKey = try aesCipher?.encrypt(data.bytes) else { throw KeystoreError.aesError }\n        let encryptedKeyData = Data(encryptedKey)\n        var dataForMAC = Data()\n        dataForMAC.append(last16bytes)\n        dataForMAC.append(encryptedKeyData)\n        let mac = dataForMAC.sha3(.keccak256)\n        \n        let kdfparams = KeystoreParamsV3.CryptoParamsV3.KdfParamsV3(salt: saltData.toHexString(), dklen: dkLen, n: N, p: P, r: R)\n        let cipherparams = KeystoreParamsV3.CryptoParamsV3.CipherParamsV3(iv: IV.toHexString())\n        let crypto = KeystoreParamsV3.CryptoParamsV3(ciphertext: encryptedKeyData.toHexString(), cipher: \"aes-128-ctr\", cipherparams: cipherparams, kdf: \"scrypt\", kdfparams: kdfparams, mac: mac.toHexString(), version: nil)\n        let keystoreparams = KeystoreParamsV3(crypto: crypto, id: UUID().uuidString.lowercased(), version: 3)\n        self.keystoreParams = keystoreparams\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Keystore/KeystoreV3Json.swift",
    "content": "//\n//  KeystoreV3Json.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 19.08.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct KeystoreParamsV3: Codable {\n    var crypto: CryptoParamsV3\n    var id: String?\n    var version: Int\n    \n    public init(crypto cr: KeystoreParamsV3.CryptoParamsV3, id i: String, version ver: Int) {\n        crypto = cr\n        id = i\n        version = ver\n    }\n    \n    public struct CryptoParamsV3: Codable {\n        var ciphertext: String\n        var cipher: String\n        var cipherparams: CipherParamsV3\n        var kdf: String\n        var kdfparams: KdfParamsV3\n        var mac: String\n        var version: String?\n        \n        public struct KdfParamsV3: Codable {\n            var salt: String\n            var dklen: Int\n            var n: Int?\n            var p: Int?\n            var r: Int?\n        }\n        \n        public struct CipherParamsV3: Codable {\n            var iv: String\n        }\n    }\n    \n    private enum CodingKeys: String, CodingKey {\n        case crypto = \"Crypto\"\n        case id, version\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Mnemonic/Mnemonic.swift",
    "content": "//\n//  Mnemonic.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/02/11.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\nimport Foundation\n\n// https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki\npublic final class Mnemonic {\n    public enum Strength: Int {\n        case normal = 128\n        case hight = 256\n    }\n    \n    public static func create(strength: Strength = .normal, language: WordList = .english) -> String {\n        let byteCount = strength.rawValue / 8\n        let bytes = Data.randomBytes(length: byteCount)\n        return create(entropy: bytes, language: language)\n    }\n    \n    public static func create(entropy: Data, language: WordList = .english) -> String {\n        let entropybits = String(entropy.flatMap { (\"00000000\" + String($0, radix: 2)).suffix(8) })\n        let hashBits = String(entropy.sha256().flatMap { (\"00000000\" + String($0, radix: 2)).suffix(8) })\n        let checkSum = String(hashBits.prefix((entropy.count * 8) / 32))\n        \n        let words = language.words\n        let concatenatedBits = entropybits + checkSum\n        \n        var mnemonic: [String] = []\n        for index in 0..<(concatenatedBits.count / 11) {\n            let startIndex = concatenatedBits.index(concatenatedBits.startIndex, offsetBy: index * 11)\n            let endIndex = concatenatedBits.index(startIndex, offsetBy: 11)\n            let wordIndex = Int(strtoul(String(concatenatedBits[startIndex..<endIndex]), nil, 2))\n            mnemonic.append(String(words[wordIndex]))\n        }\n        \n        return mnemonic.joined(separator: \" \")\n    }\n    \n    public static func createSeed(mnemonic: String, withPassphrase passphrase: String = \"\") -> Data {\n        guard let password = mnemonic.decomposedStringWithCompatibilityMapping.data(using: .utf8) else {\n            fatalError(\"Nomalizing password failed in \\(self)\")\n        }\n        \n        guard let salt = (\"mnemonic\" + passphrase).decomposedStringWithCompatibilityMapping.data(using: .utf8) else {\n            fatalError(\"Nomalizing salt failed in \\(self)\")\n        }\n        \n        return Crypto.PBKDF2SHA512(password: password.bytes, salt: salt.bytes)\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Mnemonic/WordList.swift",
    "content": "\n//\n//  WordList.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/01/01.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\n\npublic enum WordList {\n    case english\n    case japanese\n    case korean\n    case spanish\n    case simplifiedChinese\n    case traditionalChinese\n    case french\n    case italian\n    \n    public var words: [String] {\n        switch self {\n        case .english:\n            return Constants.englishWords\n        case .japanese:\n            return Constants.japaneseWords\n        case .korean:\n            return Constants.koreanWords\n        case .spanish:\n            return Constants.spanishWords\n        case .simplifiedChinese:\n            return Constants.simplifiedChineseWords\n        case .traditionalChinese:\n            return Constants.traditionalChineseWords\n        case .french:\n            return Constants.frenchWords\n        case .italian:\n            return Constants.italianWords\n        }\n    }\n}\n    \nfileprivate struct Constants {\n    static var englishWords: [String] = [\"abandon\", \"ability\", \"able\", \"about\", \"above\", \"absent\", \"absorb\", \"abstract\", \"absurd\", \"abuse\", \"access\", \"accident\", \"account\", \"accuse\", \"achieve\", \"acid\", \"acoustic\", \"acquire\", \"across\", \"act\", \"action\", \"actor\", \"actress\", \"actual\", \"adapt\", \"add\", \"addict\", \"address\", \"adjust\", \"admit\", \"adult\", \"advance\", \"advice\", \"aerobic\", \"affair\", \"afford\", \"afraid\", \"again\", \"age\", \"agent\", \"agree\", \"ahead\", \"aim\", \"air\", \"airport\", \"aisle\", \"alarm\", \"album\", \"alcohol\", \"alert\", \"alien\", \"all\", \"alley\", \"allow\", \"almost\", \"alone\", \"alpha\", \"already\", \"also\", \"alter\", \"always\", \"amateur\", \"amazing\", \"among\", \"amount\", \"amused\", \"analyst\", \"anchor\", \"ancient\", \"anger\", \"angle\", \"angry\", \"animal\", \"ankle\", \"announce\", \"annual\", \"another\", \"answer\", \"antenna\", \"antique\", \"anxiety\", \"any\", \"apart\", \"apology\", \"appear\", \"apple\", \"approve\", \"april\", \"arch\", \"arctic\", \"area\", \"arena\", \"argue\", \"arm\", \"armed\", \"armor\", \"army\", \"around\", \"arrange\", \"arrest\", \"arrive\", \"arrow\", \"art\", \"artefact\", \"artist\", \"artwork\", \"ask\", \"aspect\", \"assault\", \"asset\", \"assist\", \"assume\", \"asthma\", \"athlete\", \"atom\", \"attack\", \"attend\", \"attitude\", \"attract\", \"auction\", \"audit\", \"august\", \"aunt\", \"author\", \"auto\", \"autumn\", \"average\", \"avocado\", \"avoid\", \"awake\", \"aware\", \"away\", \"awesome\", \"awful\", \"awkward\", \"axis\", \"baby\", \"bachelor\", \"bacon\", \"badge\", \"bag\", \"balance\", \"balcony\", \"ball\", \"bamboo\", \"banana\", \"banner\", \"bar\", \"barely\", \"bargain\", \"barrel\", \"base\", \"basic\", \"basket\", \"battle\", \"beach\", \"bean\", \"beauty\", \"because\", \"become\", \"beef\", \"before\", \"begin\", \"behave\", \"behind\", \"believe\", \"below\", \"belt\", \"bench\", \"benefit\", \"best\", \"betray\", \"better\", \"between\", \"beyond\", \"bicycle\", \"bid\", \"bike\", \"bind\", \"biology\", \"bird\", \"birth\", \"bitter\", \"black\", \"blade\", \"blame\", \"blanket\", \"blast\", \"bleak\", \"bless\", \"blind\", \"blood\", \"blossom\", \"blouse\", \"blue\", \"blur\", \"blush\", \"board\", \"boat\", \"body\", \"boil\", \"bomb\", \"bone\", \"bonus\", \"book\", \"boost\", \"border\", \"boring\", \"borrow\", \"boss\", \"bottom\", \"bounce\", \"box\", \"boy\", \"bracket\", \"brain\", \"brand\", \"brass\", \"brave\", \"bread\", \"breeze\", \"brick\", \"bridge\", \"brief\", \"bright\", \"bring\", \"brisk\", \"broccoli\", \"broken\", \"bronze\", \"broom\", \"brother\", \"brown\", \"brush\", \"bubble\", \"buddy\", \"budget\", \"buffalo\", \"build\", \"bulb\", \"bulk\", \"bullet\", \"bundle\", \"bunker\", \"burden\", \"burger\", \"burst\", \"bus\", \"business\", \"busy\", \"butter\", \"buyer\", \"buzz\", \"cabbage\", \"cabin\", \"cable\", \"cactus\", \"cage\", \"cake\", \"call\", \"calm\", \"camera\", \"camp\", \"can\", \"canal\", \"cancel\", \"candy\", \"cannon\", \"canoe\", \"canvas\", \"canyon\", \"capable\", \"capital\", \"captain\", \"car\", \"carbon\", \"card\", \"cargo\", \"carpet\", \"carry\", \"cart\", \"case\", \"cash\", \"casino\", \"castle\", \"casual\", \"cat\", \"catalog\", \"catch\", \"category\", \"cattle\", \"caught\", \"cause\", \"caution\", \"cave\", \"ceiling\", \"celery\", \"cement\", \"census\", \"century\", \"cereal\", \"certain\", \"chair\", \"chalk\", \"champion\", \"change\", \"chaos\", \"chapter\", \"charge\", \"chase\", \"chat\", \"cheap\", \"check\", \"cheese\", \"chef\", \"cherry\", \"chest\", \"chicken\", \"chief\", \"child\", \"chimney\", \"choice\", \"choose\", \"chronic\", \"chuckle\", \"chunk\", \"churn\", \"cigar\", \"cinnamon\", \"circle\", \"citizen\", \"city\", \"civil\", \"claim\", \"clap\", \"clarify\", \"claw\", \"clay\", \"clean\", \"clerk\", \"clever\", \"click\", \"client\", \"cliff\", \"climb\", \"clinic\", \"clip\", \"clock\", \"clog\", \"close\", \"cloth\", \"cloud\", \"clown\", \"club\", \"clump\", \"cluster\", \"clutch\", \"coach\", \"coast\", \"coconut\", \"code\", \"coffee\", \"coil\", \"coin\", \"collect\", \"color\", \"column\", \"combine\", \"come\", \"comfort\", \"comic\", \"common\", \"company\", \"concert\", \"conduct\", \"confirm\", \"congress\", \"connect\", \"consider\", \"control\", \"convince\", \"cook\", \"cool\", \"copper\", \"copy\", \"coral\", \"core\", \"corn\", \"correct\", \"cost\", \"cotton\", \"couch\", \"country\", \"couple\", \"course\", \"cousin\", \"cover\", \"coyote\", \"crack\", \"cradle\", \"craft\", \"cram\", \"crane\", \"crash\", \"crater\", \"crawl\", \"crazy\", \"cream\", \"credit\", \"creek\", \"crew\", \"cricket\", \"crime\", \"crisp\", \"critic\", \"crop\", \"cross\", \"crouch\", \"crowd\", \"crucial\", \"cruel\", \"cruise\", \"crumble\", \"crunch\", \"crush\", \"cry\", \"crystal\", \"cube\", \"culture\", \"cup\", \"cupboard\", \"curious\", \"current\", \"curtain\", \"curve\", \"cushion\", \"custom\", \"cute\", \"cycle\", \"dad\", \"damage\", \"damp\", \"dance\", \"danger\", \"daring\", \"dash\", \"daughter\", \"dawn\", \"day\", \"deal\", \"debate\", \"debris\", \"decade\", \"december\", \"decide\", \"decline\", \"decorate\", \"decrease\", \"deer\", \"defense\", \"define\", \"defy\", \"degree\", \"delay\", \"deliver\", \"demand\", \"demise\", \"denial\", \"dentist\", \"deny\", \"depart\", \"depend\", \"deposit\", \"depth\", \"deputy\", \"derive\", \"describe\", \"desert\", \"design\", \"desk\", \"despair\", \"destroy\", \"detail\", \"detect\", \"develop\", \"device\", \"devote\", \"diagram\", \"dial\", \"diamond\", \"diary\", \"dice\", \"diesel\", \"diet\", \"differ\", \"digital\", \"dignity\", \"dilemma\", \"dinner\", \"dinosaur\", \"direct\", \"dirt\", \"disagree\", \"discover\", \"disease\", \"dish\", \"dismiss\", \"disorder\", \"display\", \"distance\", \"divert\", \"divide\", \"divorce\", \"dizzy\", \"doctor\", \"document\", \"dog\", \"doll\", \"dolphin\", \"domain\", \"donate\", \"donkey\", \"donor\", \"door\", \"dose\", \"double\", \"dove\", \"draft\", \"dragon\", \"drama\", \"drastic\", \"draw\", \"dream\", \"dress\", \"drift\", \"drill\", \"drink\", \"drip\", \"drive\", \"drop\", \"drum\", \"dry\", \"duck\", \"dumb\", \"dune\", \"during\", \"dust\", \"dutch\", \"duty\", \"dwarf\", \"dynamic\", \"eager\", \"eagle\", \"early\", \"earn\", \"earth\", \"easily\", \"east\", \"easy\", \"echo\", \"ecology\", \"economy\", \"edge\", \"edit\", \"educate\", \"effort\", \"egg\", \"eight\", \"either\", \"elbow\", \"elder\", \"electric\", \"elegant\", \"element\", \"elephant\", \"elevator\", \"elite\", \"else\", \"embark\", \"embody\", \"embrace\", \"emerge\", \"emotion\", \"employ\", \"empower\", \"empty\", \"enable\", \"enact\", \"end\", \"endless\", \"endorse\", \"enemy\", \"energy\", \"enforce\", \"engage\", \"engine\", \"enhance\", \"enjoy\", \"enlist\", \"enough\", \"enrich\", \"enroll\", \"ensure\", \"enter\", \"entire\", \"entry\", \"envelope\", \"episode\", \"equal\", \"equip\", \"era\", \"erase\", \"erode\", \"erosion\", \"error\", \"erupt\", \"escape\", \"essay\", \"essence\", \"estate\", \"eternal\", \"ethics\", \"evidence\", \"evil\", \"evoke\", \"evolve\", \"exact\", \"example\", \"excess\", \"exchange\", \"excite\", \"exclude\", \"excuse\", \"execute\", \"exercise\", \"exhaust\", \"exhibit\", \"exile\", \"exist\", \"exit\", \"exotic\", \"expand\", \"expect\", \"expire\", \"explain\", \"expose\", \"express\", \"extend\", \"extra\", \"eye\", \"eyebrow\", \"fabric\", \"face\", \"faculty\", \"fade\", \"faint\", \"faith\", \"fall\", \"false\", \"fame\", \"family\", \"famous\", \"fan\", \"fancy\", \"fantasy\", \"farm\", \"fashion\", \"fat\", \"fatal\", \"father\", \"fatigue\", \"fault\", \"favorite\", \"feature\", \"february\", \"federal\", \"fee\", \"feed\", \"feel\", \"female\", \"fence\", \"festival\", \"fetch\", \"fever\", \"few\", \"fiber\", \"fiction\", \"field\", \"figure\", \"file\", \"film\", \"filter\", \"final\", \"find\", \"fine\", \"finger\", \"finish\", \"fire\", \"firm\", \"first\", \"fiscal\", \"fish\", \"fit\", \"fitness\", \"fix\", \"flag\", \"flame\", \"flash\", \"flat\", \"flavor\", \"flee\", \"flight\", \"flip\", \"float\", \"flock\", \"floor\", \"flower\", \"fluid\", \"flush\", \"fly\", \"foam\", \"focus\", \"fog\", \"foil\", \"fold\", \"follow\", \"food\", \"foot\", \"force\", \"forest\", \"forget\", \"fork\", \"fortune\", \"forum\", \"forward\", \"fossil\", \"foster\", \"found\", \"fox\", \"fragile\", \"frame\", \"frequent\", \"fresh\", \"friend\", \"fringe\", \"frog\", \"front\", \"frost\", \"frown\", \"frozen\", \"fruit\", \"fuel\", \"fun\", \"funny\", \"furnace\", \"fury\", \"future\", \"gadget\", \"gain\", \"galaxy\", \"gallery\", \"game\", \"gap\", \"garage\", \"garbage\", \"garden\", \"garlic\", \"garment\", \"gas\", \"gasp\", \"gate\", \"gather\", \"gauge\", \"gaze\", \"general\", \"genius\", \"genre\", \"gentle\", \"genuine\", \"gesture\", \"ghost\", \"giant\", \"gift\", \"giggle\", \"ginger\", \"giraffe\", \"girl\", \"give\", \"glad\", \"glance\", \"glare\", \"glass\", \"glide\", \"glimpse\", \"globe\", \"gloom\", \"glory\", \"glove\", \"glow\", \"glue\", \"goat\", \"goddess\", \"gold\", \"good\", \"goose\", \"gorilla\", \"gospel\", \"gossip\", \"govern\", \"gown\", \"grab\", \"grace\", \"grain\", \"grant\", \"grape\", \"grass\", \"gravity\", \"great\", \"green\", \"grid\", \"grief\", \"grit\", \"grocery\", \"group\", \"grow\", \"grunt\", \"guard\", \"guess\", \"guide\", \"guilt\", \"guitar\", \"gun\", \"gym\", \"habit\", \"hair\", \"half\", \"hammer\", \"hamster\", \"hand\", \"happy\", \"harbor\", \"hard\", \"harsh\", \"harvest\", \"hat\", \"have\", \"hawk\", \"hazard\", \"head\", \"health\", \"heart\", \"heavy\", \"hedgehog\", \"height\", \"hello\", \"helmet\", \"help\", \"hen\", \"hero\", \"hidden\", \"high\", \"hill\", \"hint\", \"hip\", \"hire\", \"history\", \"hobby\", \"hockey\", \"hold\", \"hole\", \"holiday\", \"hollow\", \"home\", \"honey\", \"hood\", \"hope\", \"horn\", \"horror\", \"horse\", \"hospital\", \"host\", \"hotel\", \"hour\", \"hover\", \"hub\", \"huge\", \"human\", \"humble\", \"humor\", \"hundred\", \"hungry\", \"hunt\", \"hurdle\", \"hurry\", \"hurt\", \"husband\", \"hybrid\", \"ice\", \"icon\", \"idea\", \"identify\", \"idle\", \"ignore\", \"ill\", \"illegal\", \"illness\", \"image\", \"imitate\", \"immense\", \"immune\", \"impact\", \"impose\", \"improve\", \"impulse\", \"inch\", \"include\", \"income\", \"increase\", \"index\", \"indicate\", \"indoor\", \"industry\", \"infant\", \"inflict\", \"inform\", \"inhale\", \"inherit\", \"initial\", \"inject\", \"injury\", \"inmate\", \"inner\", \"innocent\", \"input\", \"inquiry\", \"insane\", \"insect\", \"inside\", \"inspire\", \"install\", \"intact\", \"interest\", \"into\", \"invest\", \"invite\", \"involve\", \"iron\", \"island\", \"isolate\", \"issue\", \"item\", \"ivory\", \"jacket\", \"jaguar\", \"jar\", \"jazz\", \"jealous\", \"jeans\", \"jelly\", \"jewel\", \"job\", \"join\", \"joke\", \"journey\", \"joy\", \"judge\", \"juice\", \"jump\", \"jungle\", \"junior\", \"junk\", \"just\", \"kangaroo\", \"keen\", \"keep\", \"ketchup\", \"key\", \"kick\", \"kid\", \"kidney\", \"kind\", \"kingdom\", \"kiss\", \"kit\", \"kitchen\", \"kite\", \"kitten\", \"kiwi\", \"knee\", \"knife\", \"knock\", \"know\", \"lab\", \"label\", \"labor\", \"ladder\", \"lady\", \"lake\", \"lamp\", \"language\", \"laptop\", \"large\", \"later\", \"latin\", \"laugh\", \"laundry\", \"lava\", \"law\", \"lawn\", \"lawsuit\", \"layer\", \"lazy\", \"leader\", \"leaf\", \"learn\", \"leave\", \"lecture\", \"left\", \"leg\", \"legal\", \"legend\", \"leisure\", \"lemon\", \"lend\", \"length\", \"lens\", \"leopard\", \"lesson\", \"letter\", \"level\", \"liar\", \"liberty\", \"library\", \"license\", \"life\", \"lift\", \"light\", \"like\", \"limb\", \"limit\", \"link\", \"lion\", \"liquid\", \"list\", \"little\", \"live\", \"lizard\", \"load\", \"loan\", \"lobster\", \"local\", \"lock\", \"logic\", \"lonely\", \"long\", \"loop\", \"lottery\", \"loud\", \"lounge\", \"love\", \"loyal\", \"lucky\", \"luggage\", \"lumber\", \"lunar\", \"lunch\", \"luxury\", \"lyrics\", \"machine\", \"mad\", \"magic\", \"magnet\", \"maid\", \"mail\", \"main\", \"major\", \"make\", \"mammal\", \"man\", \"manage\", \"mandate\", \"mango\", \"mansion\", \"manual\", \"maple\", \"marble\", \"march\", \"margin\", \"marine\", \"market\", \"marriage\", \"mask\", \"mass\", \"master\", \"match\", \"material\", \"math\", \"matrix\", \"matter\", \"maximum\", \"maze\", \"meadow\", \"mean\", \"measure\", \"meat\", \"mechanic\", \"medal\", \"media\", \"melody\", \"melt\", \"member\", \"memory\", \"mention\", \"menu\", \"mercy\", \"merge\", \"merit\", \"merry\", \"mesh\", \"message\", \"metal\", \"method\", \"middle\", \"midnight\", \"milk\", \"million\", \"mimic\", \"mind\", \"minimum\", \"minor\", \"minute\", \"miracle\", \"mirror\", \"misery\", \"miss\", \"mistake\", \"mix\", \"mixed\", \"mixture\", \"mobile\", \"model\", \"modify\", \"mom\", \"moment\", \"monitor\", \"monkey\", \"monster\", \"month\", \"moon\", \"moral\", \"more\", \"morning\", \"mosquito\", \"mother\", \"motion\", \"motor\", \"mountain\", \"mouse\", \"move\", \"movie\", \"much\", \"muffin\", \"mule\", \"multiply\", \"muscle\", \"museum\", \"mushroom\", \"music\", \"must\", \"mutual\", \"myself\", \"mystery\", \"myth\", \"naive\", \"name\", \"napkin\", \"narrow\", \"nasty\", \"nation\", \"nature\", \"near\", \"neck\", \"need\", \"negative\", \"neglect\", \"neither\", \"nephew\", \"nerve\", \"nest\", \"net\", \"network\", \"neutral\", \"never\", \"news\", \"next\", \"nice\", \"night\", \"noble\", \"noise\", \"nominee\", \"noodle\", \"normal\", \"north\", \"nose\", \"notable\", \"note\", \"nothing\", \"notice\", \"novel\", \"now\", \"nuclear\", \"number\", \"nurse\", \"nut\", \"oak\", \"obey\", \"object\", \"oblige\", \"obscure\", \"observe\", \"obtain\", \"obvious\", \"occur\", \"ocean\", \"october\", \"odor\", \"off\", \"offer\", \"office\", \"often\", \"oil\", \"okay\", \"old\", \"olive\", \"olympic\", \"omit\", \"once\", \"one\", \"onion\", \"online\", \"only\", \"open\", \"opera\", \"opinion\", \"oppose\", \"option\", \"orange\", \"orbit\", \"orchard\", \"order\", \"ordinary\", \"organ\", \"orient\", \"original\", \"orphan\", \"ostrich\", \"other\", \"outdoor\", \"outer\", \"output\", \"outside\", \"oval\", \"oven\", \"over\", \"own\", \"owner\", \"oxygen\", \"oyster\", \"ozone\", \"pact\", \"paddle\", \"page\", \"pair\", \"palace\", \"palm\", \"panda\", \"panel\", \"panic\", \"panther\", \"paper\", \"parade\", \"parent\", \"park\", \"parrot\", \"party\", \"pass\", \"patch\", \"path\", \"patient\", \"patrol\", \"pattern\", \"pause\", \"pave\", \"payment\", \"peace\", \"peanut\", \"pear\", \"peasant\", \"pelican\", \"pen\", \"penalty\", \"pencil\", \"people\", \"pepper\", \"perfect\", \"permit\", \"person\", \"pet\", \"phone\", \"photo\", \"phrase\", \"physical\", \"piano\", \"picnic\", \"picture\", \"piece\", \"pig\", \"pigeon\", \"pill\", \"pilot\", \"pink\", \"pioneer\", \"pipe\", \"pistol\", \"pitch\", \"pizza\", \"place\", \"planet\", \"plastic\", \"plate\", \"play\", \"please\", \"pledge\", \"pluck\", \"plug\", \"plunge\", \"poem\", \"poet\", \"point\", \"polar\", \"pole\", \"police\", \"pond\", \"pony\", \"pool\", \"popular\", \"portion\", \"position\", \"possible\", \"post\", \"potato\", \"pottery\", \"poverty\", \"powder\", \"power\", \"practice\", \"praise\", \"predict\", \"prefer\", \"prepare\", \"present\", \"pretty\", \"prevent\", \"price\", \"pride\", \"primary\", \"print\", \"priority\", \"prison\", \"private\", \"prize\", \"problem\", \"process\", \"produce\", \"profit\", \"program\", \"project\", \"promote\", \"proof\", \"property\", \"prosper\", \"protect\", \"proud\", \"provide\", \"public\", \"pudding\", \"pull\", \"pulp\", \"pulse\", \"pumpkin\", \"punch\", \"pupil\", \"puppy\", \"purchase\", \"purity\", \"purpose\", \"purse\", \"push\", \"put\", \"puzzle\", \"pyramid\", \"quality\", \"quantum\", \"quarter\", \"question\", \"quick\", \"quit\", \"quiz\", \"quote\", \"rabbit\", \"raccoon\", \"race\", \"rack\", \"radar\", \"radio\", \"rail\", \"rain\", \"raise\", \"rally\", \"ramp\", \"ranch\", \"random\", \"range\", \"rapid\", \"rare\", \"rate\", \"rather\", \"raven\", \"raw\", \"razor\", \"ready\", \"real\", \"reason\", \"rebel\", \"rebuild\", \"recall\", \"receive\", \"recipe\", \"record\", \"recycle\", \"reduce\", \"reflect\", \"reform\", \"refuse\", \"region\", \"regret\", \"regular\", \"reject\", \"relax\", \"release\", \"relief\", \"rely\", \"remain\", \"remember\", \"remind\", \"remove\", \"render\", \"renew\", \"rent\", \"reopen\", \"repair\", \"repeat\", \"replace\", \"report\", \"require\", \"rescue\", \"resemble\", \"resist\", \"resource\", \"response\", \"result\", \"retire\", \"retreat\", \"return\", \"reunion\", \"reveal\", \"review\", \"reward\", \"rhythm\", \"rib\", \"ribbon\", \"rice\", \"rich\", \"ride\", \"ridge\", \"rifle\", \"right\", \"rigid\", \"ring\", \"riot\", \"ripple\", \"risk\", \"ritual\", \"rival\", \"river\", \"road\", \"roast\", \"robot\", \"robust\", \"rocket\", \"romance\", \"roof\", \"rookie\", \"room\", \"rose\", \"rotate\", \"rough\", \"round\", \"route\", \"royal\", \"rubber\", \"rude\", \"rug\", \"rule\", \"run\", \"runway\", \"rural\", \"sad\", \"saddle\", \"sadness\", \"safe\", \"sail\", \"salad\", \"salmon\", \"salon\", \"salt\", \"salute\", \"same\", \"sample\", \"sand\", \"satisfy\", \"satoshi\", \"sauce\", \"sausage\", \"save\", \"say\", \"scale\", \"scan\", \"scare\", \"scatter\", \"scene\", \"scheme\", \"school\", \"science\", \"scissors\", \"scorpion\", \"scout\", \"scrap\", \"screen\", \"script\", \"scrub\", \"sea\", \"search\", \"season\", \"seat\", \"second\", \"secret\", \"section\", \"security\", \"seed\", \"seek\", \"segment\", \"select\", \"sell\", \"seminar\", \"senior\", \"sense\", \"sentence\", \"series\", \"service\", \"session\", \"settle\", \"setup\", \"seven\", \"shadow\", \"shaft\", \"shallow\", \"share\", \"shed\", \"shell\", \"sheriff\", \"shield\", \"shift\", \"shine\", \"ship\", \"shiver\", \"shock\", \"shoe\", \"shoot\", \"shop\", \"short\", \"shoulder\", \"shove\", \"shrimp\", \"shrug\", \"shuffle\", \"shy\", \"sibling\", \"sick\", \"side\", \"siege\", \"sight\", \"sign\", \"silent\", \"silk\", \"silly\", \"silver\", \"similar\", \"simple\", \"since\", \"sing\", \"siren\", \"sister\", \"situate\", \"six\", \"size\", \"skate\", \"sketch\", \"ski\", \"skill\", \"skin\", \"skirt\", \"skull\", \"slab\", \"slam\", \"sleep\", \"slender\", \"slice\", \"slide\", \"slight\", \"slim\", \"slogan\", \"slot\", \"slow\", \"slush\", \"small\", \"smart\", \"smile\", \"smoke\", \"smooth\", \"snack\", \"snake\", \"snap\", \"sniff\", \"snow\", \"soap\", \"soccer\", \"social\", \"sock\", \"soda\", \"soft\", \"solar\", \"soldier\", \"solid\", \"solution\", \"solve\", \"someone\", \"song\", \"soon\", \"sorry\", \"sort\", \"soul\", \"sound\", \"soup\", \"source\", \"south\", \"space\", \"spare\", \"spatial\", \"spawn\", \"speak\", \"special\", \"speed\", \"spell\", \"spend\", \"sphere\", \"spice\", \"spider\", \"spike\", \"spin\", \"spirit\", \"split\", \"spoil\", \"sponsor\", \"spoon\", \"sport\", \"spot\", \"spray\", \"spread\", \"spring\", \"spy\", \"square\", \"squeeze\", \"squirrel\", \"stable\", \"stadium\", \"staff\", \"stage\", \"stairs\", \"stamp\", \"stand\", \"start\", \"state\", \"stay\", \"steak\", \"steel\", \"stem\", \"step\", \"stereo\", \"stick\", \"still\", \"sting\", \"stock\", \"stomach\", \"stone\", \"stool\", \"story\", \"stove\", \"strategy\", \"street\", \"strike\", \"strong\", \"struggle\", \"student\", \"stuff\", \"stumble\", \"style\", \"subject\", \"submit\", \"subway\", \"success\", \"such\", \"sudden\", \"suffer\", \"sugar\", \"suggest\", \"suit\", \"summer\", \"sun\", \"sunny\", \"sunset\", \"super\", \"supply\", \"supreme\", \"sure\", \"surface\", \"surge\", \"surprise\", \"surround\", \"survey\", \"suspect\", \"sustain\", \"swallow\", \"swamp\", \"swap\", \"swarm\", \"swear\", \"sweet\", \"swift\", \"swim\", \"swing\", \"switch\", \"sword\", \"symbol\", \"symptom\", \"syrup\", \"system\", \"table\", \"tackle\", \"tag\", \"tail\", \"talent\", \"talk\", \"tank\", \"tape\", \"target\", \"task\", \"taste\", \"tattoo\", \"taxi\", \"teach\", \"team\", \"tell\", \"ten\", \"tenant\", \"tennis\", \"tent\", \"term\", \"test\", \"text\", \"thank\", \"that\", \"theme\", \"then\", \"theory\", \"there\", \"they\", \"thing\", \"this\", \"thought\", \"three\", \"thrive\", \"throw\", \"thumb\", \"thunder\", \"ticket\", \"tide\", \"tiger\", \"tilt\", \"timber\", \"time\", \"tiny\", \"tip\", \"tired\", \"tissue\", \"title\", \"toast\", \"tobacco\", \"today\", \"toddler\", \"toe\", \"together\", \"toilet\", \"token\", \"tomato\", \"tomorrow\", \"tone\", \"tongue\", \"tonight\", \"tool\", \"tooth\", \"top\", \"topic\", \"topple\", \"torch\", \"tornado\", \"tortoise\", \"toss\", \"total\", \"tourist\", \"toward\", \"tower\", \"town\", \"toy\", \"track\", \"trade\", \"traffic\", \"tragic\", \"train\", \"transfer\", \"trap\", \"trash\", \"travel\", \"tray\", \"treat\", \"tree\", \"trend\", \"trial\", \"tribe\", \"trick\", \"trigger\", \"trim\", \"trip\", \"trophy\", \"trouble\", \"truck\", \"true\", \"truly\", \"trumpet\", \"trust\", \"truth\", \"try\", \"tube\", \"tuition\", \"tumble\", \"tuna\", \"tunnel\", \"turkey\", \"turn\", \"turtle\", \"twelve\", \"twenty\", \"twice\", \"twin\", \"twist\", \"two\", \"type\", \"typical\", \"ugly\", \"umbrella\", \"unable\", \"unaware\", \"uncle\", \"uncover\", \"under\", \"undo\", \"unfair\", \"unfold\", \"unhappy\", \"uniform\", \"unique\", \"unit\", \"universe\", \"unknown\", \"unlock\", \"until\", \"unusual\", \"unveil\", \"update\", \"upgrade\", \"uphold\", \"upon\", \"upper\", \"upset\", \"urban\", \"urge\", \"usage\", \"use\", \"used\", \"useful\", \"useless\", \"usual\", \"utility\", \"vacant\", \"vacuum\", \"vague\", \"valid\", \"valley\", \"valve\", \"van\", \"vanish\", \"vapor\", \"various\", \"vast\", \"vault\", \"vehicle\", \"velvet\", \"vendor\", \"venture\", \"venue\", \"verb\", \"verify\", \"version\", \"very\", \"vessel\", \"veteran\", \"viable\", \"vibrant\", \"vicious\", \"victory\", \"video\", \"view\", \"village\", \"vintage\", \"violin\", \"virtual\", \"virus\", \"visa\", \"visit\", \"visual\", \"vital\", \"vivid\", \"vocal\", \"voice\", \"void\", \"volcano\", \"volume\", \"vote\", \"voyage\", \"wage\", \"wagon\", \"wait\", \"walk\", \"wall\", \"walnut\", \"want\", \"warfare\", \"warm\", \"warrior\", \"wash\", \"wasp\", \"waste\", \"water\", \"wave\", \"way\", \"wealth\", \"weapon\", \"wear\", \"weasel\", \"weather\", \"web\", \"wedding\", \"weekend\", \"weird\", \"welcome\", \"west\", \"wet\", \"whale\", \"what\", \"wheat\", \"wheel\", \"when\", \"where\", \"whip\", \"whisper\", \"wide\", \"width\", \"wife\", \"wild\", \"will\", \"win\", \"window\", \"wine\", \"wing\", \"wink\", \"winner\", \"winter\", \"wire\", \"wisdom\", \"wise\", \"wish\", \"witness\", \"wolf\", \"woman\", \"wonder\", \"wood\", \"wool\", \"word\", \"work\", \"world\", \"worry\", \"worth\", \"wrap\", \"wreck\", \"wrestle\", \"wrist\", \"write\", \"wrong\", \"yard\", \"year\", \"yellow\", \"you\", \"young\", \"youth\", \"zebra\", \"zero\", \"zone\", \"zoo\"]\n    static var japaneseWords: [String] = [\"あいこくしん\", \"あいさつ\", \"あいだ\", \"あおぞら\", \"あかちゃん\", \"あきる\", \"あけがた\", \"あける\", \"あこがれる\", \"あさい\", \"あさひ\", \"あしあと\", \"あじわう\", \"あずかる\", \"あずき\", \"あそぶ\", \"あたえる\", \"あたためる\", \"あたりまえ\", \"あたる\", \"あつい\", \"あつかう\", \"あっしゅく\", \"あつまり\", \"あつめる\", \"あてな\", \"あてはまる\", \"あひる\", \"あぶら\", \"あぶる\", \"あふれる\", \"あまい\", \"あまど\", \"あまやかす\", \"あまり\", \"あみもの\", \"あめりか\", \"あやまる\", \"あゆむ\", \"あらいぐま\", \"あらし\", \"あらすじ\", \"あらためる\", \"あらゆる\", \"あらわす\", \"ありがとう\", \"あわせる\", \"あわてる\", \"あんい\", \"あんがい\", \"あんこ\", \"あんぜん\", \"あんてい\", \"あんない\", \"あんまり\", \"いいだす\", \"いおん\", \"いがい\", \"いがく\", \"いきおい\", \"いきなり\", \"いきもの\", \"いきる\", \"いくじ\", \"いくぶん\", \"いけばな\", \"いけん\", \"いこう\", \"いこく\", \"いこつ\", \"いさましい\", \"いさん\", \"いしき\", \"いじゅう\", \"いじょう\", \"いじわる\", \"いずみ\", \"いずれ\", \"いせい\", \"いせえび\", \"いせかい\", \"いせき\", \"いぜん\", \"いそうろう\", \"いそがしい\", \"いだい\", \"いだく\", \"いたずら\", \"いたみ\", \"いたりあ\", \"いちおう\", \"いちじ\", \"いちど\", \"いちば\", \"いちぶ\", \"いちりゅう\", \"いつか\", \"いっしゅん\", \"いっせい\", \"いっそう\", \"いったん\", \"いっち\", \"いってい\", \"いっぽう\", \"いてざ\", \"いてん\", \"いどう\", \"いとこ\", \"いない\", \"いなか\", \"いねむり\", \"いのち\", \"いのる\", \"いはつ\", \"いばる\", \"いはん\", \"いびき\", \"いひん\", \"いふく\", \"いへん\", \"いほう\", \"いみん\", \"いもうと\", \"いもたれ\", \"いもり\", \"いやがる\", \"いやす\", \"いよかん\", \"いよく\", \"いらい\", \"いらすと\", \"いりぐち\", \"いりょう\", \"いれい\", \"いれもの\", \"いれる\", \"いろえんぴつ\", \"いわい\", \"いわう\", \"いわかん\", \"いわば\", \"いわゆる\", \"いんげんまめ\", \"いんさつ\", \"いんしょう\", \"いんよう\", \"うえき\", \"うえる\", \"うおざ\", \"うがい\", \"うかぶ\", \"うかべる\", \"うきわ\", \"うくらいな\", \"うくれれ\", \"うけたまわる\", \"うけつけ\", \"うけとる\", \"うけもつ\", \"うける\", \"うごかす\", \"うごく\", \"うこん\", \"うさぎ\", \"うしなう\", \"うしろがみ\", \"うすい\", \"うすぎ\", \"うすぐらい\", \"うすめる\", \"うせつ\", \"うちあわせ\", \"うちがわ\", \"うちき\", \"うちゅう\", \"うっかり\", \"うつくしい\", \"うったえる\", \"うつる\", \"うどん\", \"うなぎ\", \"うなじ\", \"うなずく\", \"うなる\", \"うねる\", \"うのう\", \"うぶげ\", \"うぶごえ\", \"うまれる\", \"うめる\", \"うもう\", \"うやまう\", \"うよく\", \"うらがえす\", \"うらぐち\", \"うらない\", \"うりあげ\", \"うりきれ\", \"うるさい\", \"うれしい\", \"うれゆき\", \"うれる\", \"うろこ\", \"うわき\", \"うわさ\", \"うんこう\", \"うんちん\", \"うんてん\", \"うんどう\", \"えいえん\", \"えいが\", \"えいきょう\", \"えいご\", \"えいせい\", \"えいぶん\", \"えいよう\", \"えいわ\", \"えおり\", \"えがお\", \"えがく\", \"えきたい\", \"えくせる\", \"えしゃく\", \"えすて\", \"えつらん\", \"えのぐ\", \"えほうまき\", \"えほん\", \"えまき\", \"えもじ\", \"えもの\", \"えらい\", \"えらぶ\", \"えりあ\", \"えんえん\", \"えんかい\", \"えんぎ\", \"えんげき\", \"えんしゅう\", \"えんぜつ\", \"えんそく\", \"えんちょう\", \"えんとつ\", \"おいかける\", \"おいこす\", \"おいしい\", \"おいつく\", \"おうえん\", \"おうさま\", \"おうじ\", \"おうせつ\", \"おうたい\", \"おうふく\", \"おうべい\", \"おうよう\", \"おえる\", \"おおい\", \"おおう\", \"おおどおり\", \"おおや\", \"おおよそ\", \"おかえり\", \"おかず\", \"おがむ\", \"おかわり\", \"おぎなう\", \"おきる\", \"おくさま\", \"おくじょう\", \"おくりがな\", \"おくる\", \"おくれる\", \"おこす\", \"おこなう\", \"おこる\", \"おさえる\", \"おさない\", \"おさめる\", \"おしいれ\", \"おしえる\", \"おじぎ\", \"おじさん\", \"おしゃれ\", \"おそらく\", \"おそわる\", \"おたがい\", \"おたく\", \"おだやか\", \"おちつく\", \"おっと\", \"おつり\", \"おでかけ\", \"おとしもの\", \"おとなしい\", \"おどり\", \"おどろかす\", \"おばさん\", \"おまいり\", \"おめでとう\", \"おもいで\", \"おもう\", \"おもたい\", \"おもちゃ\", \"おやつ\", \"おやゆび\", \"およぼす\", \"おらんだ\", \"おろす\", \"おんがく\", \"おんけい\", \"おんしゃ\", \"おんせん\", \"おんだん\", \"おんちゅう\", \"おんどけい\", \"かあつ\", \"かいが\", \"がいき\", \"がいけん\", \"がいこう\", \"かいさつ\", \"かいしゃ\", \"かいすいよく\", \"かいぜん\", \"かいぞうど\", \"かいつう\", \"かいてん\", \"かいとう\", \"かいふく\", \"がいへき\", \"かいほう\", \"かいよう\", \"がいらい\", \"かいわ\", \"かえる\", \"かおり\", \"かかえる\", \"かがく\", \"かがし\", \"かがみ\", \"かくご\", \"かくとく\", \"かざる\", \"がぞう\", \"かたい\", \"かたち\", \"がちょう\", \"がっきゅう\", \"がっこう\", \"がっさん\", \"がっしょう\", \"かなざわし\", \"かのう\", \"がはく\", \"かぶか\", \"かほう\", \"かほご\", \"かまう\", \"かまぼこ\", \"かめれおん\", \"かゆい\", \"かようび\", \"からい\", \"かるい\", \"かろう\", \"かわく\", \"かわら\", \"がんか\", \"かんけい\", \"かんこう\", \"かんしゃ\", \"かんそう\", \"かんたん\", \"かんち\", \"がんばる\", \"きあい\", \"きあつ\", \"きいろ\", \"ぎいん\", \"きうい\", \"きうん\", \"きえる\", \"きおう\", \"きおく\", \"きおち\", \"きおん\", \"きかい\", \"きかく\", \"きかんしゃ\", \"ききて\", \"きくばり\", \"きくらげ\", \"きけんせい\", \"きこう\", \"きこえる\", \"きこく\", \"きさい\", \"きさく\", \"きさま\", \"きさらぎ\", \"ぎじかがく\", \"ぎしき\", \"ぎじたいけん\", \"ぎじにってい\", \"ぎじゅつしゃ\", \"きすう\", \"きせい\", \"きせき\", \"きせつ\", \"きそう\", \"きぞく\", \"きぞん\", \"きたえる\", \"きちょう\", \"きつえん\", \"ぎっちり\", \"きつつき\", \"きつね\", \"きてい\", \"きどう\", \"きどく\", \"きない\", \"きなが\", \"きなこ\", \"きぬごし\", \"きねん\", \"きのう\", \"きのした\", \"きはく\", \"きびしい\", \"きひん\", \"きふく\", \"きぶん\", \"きぼう\", \"きほん\", \"きまる\", \"きみつ\", \"きむずかしい\", \"きめる\", \"きもだめし\", \"きもち\", \"きもの\", \"きゃく\", \"きやく\", \"ぎゅうにく\", \"きよう\", \"きょうりゅう\", \"きらい\", \"きらく\", \"きりん\", \"きれい\", \"きれつ\", \"きろく\", \"ぎろん\", \"きわめる\", \"ぎんいろ\", \"きんかくじ\", \"きんじょ\", \"きんようび\", \"ぐあい\", \"くいず\", \"くうかん\", \"くうき\", \"くうぐん\", \"くうこう\", \"ぐうせい\", \"くうそう\", \"ぐうたら\", \"くうふく\", \"くうぼ\", \"くかん\", \"くきょう\", \"くげん\", \"ぐこう\", \"くさい\", \"くさき\", \"くさばな\", \"くさる\", \"くしゃみ\", \"くしょう\", \"くすのき\", \"くすりゆび\", \"くせげ\", \"くせん\", \"ぐたいてき\", \"くださる\", \"くたびれる\", \"くちこみ\", \"くちさき\", \"くつした\", \"ぐっすり\", \"くつろぐ\", \"くとうてん\", \"くどく\", \"くなん\", \"くねくね\", \"くのう\", \"くふう\", \"くみあわせ\", \"くみたてる\", \"くめる\", \"くやくしょ\", \"くらす\", \"くらべる\", \"くるま\", \"くれる\", \"くろう\", \"くわしい\", \"ぐんかん\", \"ぐんしょく\", \"ぐんたい\", \"ぐんて\", \"けあな\", \"けいかく\", \"けいけん\", \"けいこ\", \"けいさつ\", \"げいじゅつ\", \"けいたい\", \"げいのうじん\", \"けいれき\", \"けいろ\", \"けおとす\", \"けおりもの\", \"げきか\", \"げきげん\", \"げきだん\", \"げきちん\", \"げきとつ\", \"げきは\", \"げきやく\", \"げこう\", \"げこくじょう\", \"げざい\", \"けさき\", \"げざん\", \"けしき\", \"けしごむ\", \"けしょう\", \"げすと\", \"けたば\", \"けちゃっぷ\", \"けちらす\", \"けつあつ\", \"けつい\", \"けつえき\", \"けっこん\", \"けつじょ\", \"けっせき\", \"けってい\", \"けつまつ\", \"げつようび\", \"げつれい\", \"けつろん\", \"げどく\", \"けとばす\", \"けとる\", \"けなげ\", \"けなす\", \"けなみ\", \"けぬき\", \"げねつ\", \"けねん\", \"けはい\", \"げひん\", \"けぶかい\", \"げぼく\", \"けまり\", \"けみかる\", \"けむし\", \"けむり\", \"けもの\", \"けらい\", \"けろけろ\", \"けわしい\", \"けんい\", \"けんえつ\", \"けんお\", \"けんか\", \"げんき\", \"けんげん\", \"けんこう\", \"けんさく\", \"けんしゅう\", \"けんすう\", \"げんそう\", \"けんちく\", \"けんてい\", \"けんとう\", \"けんない\", \"けんにん\", \"げんぶつ\", \"けんま\", \"けんみん\", \"けんめい\", \"けんらん\", \"けんり\", \"こあくま\", \"こいぬ\", \"こいびと\", \"ごうい\", \"こうえん\", \"こうおん\", \"こうかん\", \"ごうきゅう\", \"ごうけい\", \"こうこう\", \"こうさい\", \"こうじ\", \"こうすい\", \"ごうせい\", \"こうそく\", \"こうたい\", \"こうちゃ\", \"こうつう\", \"こうてい\", \"こうどう\", \"こうない\", \"こうはい\", \"ごうほう\", \"ごうまん\", \"こうもく\", \"こうりつ\", \"こえる\", \"こおり\", \"ごかい\", \"ごがつ\", \"ごかん\", \"こくご\", \"こくさい\", \"こくとう\", \"こくない\", \"こくはく\", \"こぐま\", \"こけい\", \"こける\", \"ここのか\", \"こころ\", \"こさめ\", \"こしつ\", \"こすう\", \"こせい\", \"こせき\", \"こぜん\", \"こそだて\", \"こたい\", \"こたえる\", \"こたつ\", \"こちょう\", \"こっか\", \"こつこつ\", \"こつばん\", \"こつぶ\", \"こてい\", \"こてん\", \"ことがら\", \"ことし\", \"ことば\", \"ことり\", \"こなごな\", \"こねこね\", \"このまま\", \"このみ\", \"このよ\", \"ごはん\", \"こひつじ\", \"こふう\", \"こふん\", \"こぼれる\", \"ごまあぶら\", \"こまかい\", \"ごますり\", \"こまつな\", \"こまる\", \"こむぎこ\", \"こもじ\", \"こもち\", \"こもの\", \"こもん\", \"こやく\", \"こやま\", \"こゆう\", \"こゆび\", \"こよい\", \"こよう\", \"こりる\", \"これくしょん\", \"ころっけ\", \"こわもて\", \"こわれる\", \"こんいん\", \"こんかい\", \"こんき\", \"こんしゅう\", \"こんすい\", \"こんだて\", \"こんとん\", \"こんなん\", \"こんびに\", \"こんぽん\", \"こんまけ\", \"こんや\", \"こんれい\", \"こんわく\", \"ざいえき\", \"さいかい\", \"さいきん\", \"ざいげん\", \"ざいこ\", \"さいしょ\", \"さいせい\", \"ざいたく\", \"ざいちゅう\", \"さいてき\", \"ざいりょう\", \"さうな\", \"さかいし\", \"さがす\", \"さかな\", \"さかみち\", \"さがる\", \"さぎょう\", \"さくし\", \"さくひん\", \"さくら\", \"さこく\", \"さこつ\", \"さずかる\", \"ざせき\", \"さたん\", \"さつえい\", \"ざつおん\", \"ざっか\", \"ざつがく\", \"さっきょく\", \"ざっし\", \"さつじん\", \"ざっそう\", \"さつたば\", \"さつまいも\", \"さてい\", \"さといも\", \"さとう\", \"さとおや\", \"さとし\", \"さとる\", \"さのう\", \"さばく\", \"さびしい\", \"さべつ\", \"さほう\", \"さほど\", \"さます\", \"さみしい\", \"さみだれ\", \"さむけ\", \"さめる\", \"さやえんどう\", \"さゆう\", \"さよう\", \"さよく\", \"さらだ\", \"ざるそば\", \"さわやか\", \"さわる\", \"さんいん\", \"さんか\", \"さんきゃく\", \"さんこう\", \"さんさい\", \"ざんしょ\", \"さんすう\", \"さんせい\", \"さんそ\", \"さんち\", \"さんま\", \"さんみ\", \"さんらん\", \"しあい\", \"しあげ\", \"しあさって\", \"しあわせ\", \"しいく\", \"しいん\", \"しうち\", \"しえい\", \"しおけ\", \"しかい\", \"しかく\", \"じかん\", \"しごと\", \"しすう\", \"じだい\", \"したうけ\", \"したぎ\", \"したて\", \"したみ\", \"しちょう\", \"しちりん\", \"しっかり\", \"しつじ\", \"しつもん\", \"してい\", \"してき\", \"してつ\", \"じてん\", \"じどう\", \"しなぎれ\", \"しなもの\", \"しなん\", \"しねま\", \"しねん\", \"しのぐ\", \"しのぶ\", \"しはい\", \"しばかり\", \"しはつ\", \"しはらい\", \"しはん\", \"しひょう\", \"しふく\", \"じぶん\", \"しへい\", \"しほう\", \"しほん\", \"しまう\", \"しまる\", \"しみん\", \"しむける\", \"じむしょ\", \"しめい\", \"しめる\", \"しもん\", \"しゃいん\", \"しゃうん\", \"しゃおん\", \"じゃがいも\", \"しやくしょ\", \"しゃくほう\", \"しゃけん\", \"しゃこ\", \"しゃざい\", \"しゃしん\", \"しゃせん\", \"しゃそう\", \"しゃたい\", \"しゃちょう\", \"しゃっきん\", \"じゃま\", \"しゃりん\", \"しゃれい\", \"じゆう\", \"じゅうしょ\", \"しゅくはく\", \"じゅしん\", \"しゅっせき\", \"しゅみ\", \"しゅらば\", \"じゅんばん\", \"しょうかい\", \"しょくたく\", \"しょっけん\", \"しょどう\", \"しょもつ\", \"しらせる\", \"しらべる\", \"しんか\", \"しんこう\", \"じんじゃ\", \"しんせいじ\", \"しんちく\", \"しんりん\", \"すあげ\", \"すあし\", \"すあな\", \"ずあん\", \"すいえい\", \"すいか\", \"すいとう\", \"ずいぶん\", \"すいようび\", \"すうがく\", \"すうじつ\", \"すうせん\", \"すおどり\", \"すきま\", \"すくう\", \"すくない\", \"すける\", \"すごい\", \"すこし\", \"ずさん\", \"すずしい\", \"すすむ\", \"すすめる\", \"すっかり\", \"ずっしり\", \"ずっと\", \"すてき\", \"すてる\", \"すねる\", \"すのこ\", \"すはだ\", \"すばらしい\", \"ずひょう\", \"ずぶぬれ\", \"すぶり\", \"すふれ\", \"すべて\", \"すべる\", \"ずほう\", \"すぼん\", \"すまい\", \"すめし\", \"すもう\", \"すやき\", \"すらすら\", \"するめ\", \"すれちがう\", \"すろっと\", \"すわる\", \"すんぜん\", \"すんぽう\", \"せあぶら\", \"せいかつ\", \"せいげん\", \"せいじ\", \"せいよう\", \"せおう\", \"せかいかん\", \"せきにん\", \"せきむ\", \"せきゆ\", \"せきらんうん\", \"せけん\", \"せこう\", \"せすじ\", \"せたい\", \"せたけ\", \"せっかく\", \"せっきゃく\", \"ぜっく\", \"せっけん\", \"せっこつ\", \"せっさたくま\", \"せつぞく\", \"せつだん\", \"せつでん\", \"せっぱん\", \"せつび\", \"せつぶん\", \"せつめい\", \"せつりつ\", \"せなか\", \"せのび\", \"せはば\", \"せびろ\", \"せぼね\", \"せまい\", \"せまる\", \"せめる\", \"せもたれ\", \"せりふ\", \"ぜんあく\", \"せんい\", \"せんえい\", \"せんか\", \"せんきょ\", \"せんく\", \"せんげん\", \"ぜんご\", \"せんさい\", \"せんしゅ\", \"せんすい\", \"せんせい\", \"せんぞ\", \"せんたく\", \"せんちょう\", \"せんてい\", \"せんとう\", \"せんぬき\", \"せんねん\", \"せんぱい\", \"ぜんぶ\", \"ぜんぽう\", \"せんむ\", \"せんめんじょ\", \"せんもん\", \"せんやく\", \"せんゆう\", \"せんよう\", \"ぜんら\", \"ぜんりゃく\", \"せんれい\", \"せんろ\", \"そあく\", \"そいとげる\", \"そいね\", \"そうがんきょう\", \"そうき\", \"そうご\", \"そうしん\", \"そうだん\", \"そうなん\", \"そうび\", \"そうめん\", \"そうり\", \"そえもの\", \"そえん\", \"そがい\", \"そげき\", \"そこう\", \"そこそこ\", \"そざい\", \"そしな\", \"そせい\", \"そせん\", \"そそぐ\", \"そだてる\", \"そつう\", \"そつえん\", \"そっかん\", \"そつぎょう\", \"そっけつ\", \"そっこう\", \"そっせん\", \"そっと\", \"そとがわ\", \"そとづら\", \"そなえる\", \"そなた\", \"そふぼ\", \"そぼく\", \"そぼろ\", \"そまつ\", \"そまる\", \"そむく\", \"そむりえ\", \"そめる\", \"そもそも\", \"そよかぜ\", \"そらまめ\", \"そろう\", \"そんかい\", \"そんけい\", \"そんざい\", \"そんしつ\", \"そんぞく\", \"そんちょう\", \"ぞんび\", \"ぞんぶん\", \"そんみん\", \"たあい\", \"たいいん\", \"たいうん\", \"たいえき\", \"たいおう\", \"だいがく\", \"たいき\", \"たいぐう\", \"たいけん\", \"たいこ\", \"たいざい\", \"だいじょうぶ\", \"だいすき\", \"たいせつ\", \"たいそう\", \"だいたい\", \"たいちょう\", \"たいてい\", \"だいどころ\", \"たいない\", \"たいねつ\", \"たいのう\", \"たいはん\", \"だいひょう\", \"たいふう\", \"たいへん\", \"たいほ\", \"たいまつばな\", \"たいみんぐ\", \"たいむ\", \"たいめん\", \"たいやき\", \"たいよう\", \"たいら\", \"たいりょく\", \"たいる\", \"たいわん\", \"たうえ\", \"たえる\", \"たおす\", \"たおる\", \"たおれる\", \"たかい\", \"たかね\", \"たきび\", \"たくさん\", \"たこく\", \"たこやき\", \"たさい\", \"たしざん\", \"だじゃれ\", \"たすける\", \"たずさわる\", \"たそがれ\", \"たたかう\", \"たたく\", \"ただしい\", \"たたみ\", \"たちばな\", \"だっかい\", \"だっきゃく\", \"だっこ\", \"だっしゅつ\", \"だったい\", \"たてる\", \"たとえる\", \"たなばた\", \"たにん\", \"たぬき\", \"たのしみ\", \"たはつ\", \"たぶん\", \"たべる\", \"たぼう\", \"たまご\", \"たまる\", \"だむる\", \"ためいき\", \"ためす\", \"ためる\", \"たもつ\", \"たやすい\", \"たよる\", \"たらす\", \"たりきほんがん\", \"たりょう\", \"たりる\", \"たると\", \"たれる\", \"たれんと\", \"たろっと\", \"たわむれる\", \"だんあつ\", \"たんい\", \"たんおん\", \"たんか\", \"たんき\", \"たんけん\", \"たんご\", \"たんさん\", \"たんじょうび\", \"だんせい\", \"たんそく\", \"たんたい\", \"だんち\", \"たんてい\", \"たんとう\", \"だんな\", \"たんにん\", \"だんねつ\", \"たんのう\", \"たんぴん\", \"だんぼう\", \"たんまつ\", \"たんめい\", \"だんれつ\", \"だんろ\", \"だんわ\", \"ちあい\", \"ちあん\", \"ちいき\", \"ちいさい\", \"ちえん\", \"ちかい\", \"ちから\", \"ちきゅう\", \"ちきん\", \"ちけいず\", \"ちけん\", \"ちこく\", \"ちさい\", \"ちしき\", \"ちしりょう\", \"ちせい\", \"ちそう\", \"ちたい\", \"ちたん\", \"ちちおや\", \"ちつじょ\", \"ちてき\", \"ちてん\", \"ちぬき\", \"ちぬり\", \"ちのう\", \"ちひょう\", \"ちへいせん\", \"ちほう\", \"ちまた\", \"ちみつ\", \"ちみどろ\", \"ちめいど\", \"ちゃんこなべ\", \"ちゅうい\", \"ちゆりょく\", \"ちょうし\", \"ちょさくけん\", \"ちらし\", \"ちらみ\", \"ちりがみ\", \"ちりょう\", \"ちるど\", \"ちわわ\", \"ちんたい\", \"ちんもく\", \"ついか\", \"ついたち\", \"つうか\", \"つうじょう\", \"つうはん\", \"つうわ\", \"つかう\", \"つかれる\", \"つくね\", \"つくる\", \"つけね\", \"つける\", \"つごう\", \"つたえる\", \"つづく\", \"つつじ\", \"つつむ\", \"つとめる\", \"つながる\", \"つなみ\", \"つねづね\", \"つのる\", \"つぶす\", \"つまらない\", \"つまる\", \"つみき\", \"つめたい\", \"つもり\", \"つもる\", \"つよい\", \"つるぼ\", \"つるみく\", \"つわもの\", \"つわり\", \"てあし\", \"てあて\", \"てあみ\", \"ていおん\", \"ていか\", \"ていき\", \"ていけい\", \"ていこく\", \"ていさつ\", \"ていし\", \"ていせい\", \"ていたい\", \"ていど\", \"ていねい\", \"ていひょう\", \"ていへん\", \"ていぼう\", \"てうち\", \"ておくれ\", \"てきとう\", \"てくび\", \"でこぼこ\", \"てさぎょう\", \"てさげ\", \"てすり\", \"てそう\", \"てちがい\", \"てちょう\", \"てつがく\", \"てつづき\", \"でっぱ\", \"てつぼう\", \"てつや\", \"でぬかえ\", \"てぬき\", \"てぬぐい\", \"てのひら\", \"てはい\", \"てぶくろ\", \"てふだ\", \"てほどき\", \"てほん\", \"てまえ\", \"てまきずし\", \"てみじか\", \"てみやげ\", \"てらす\", \"てれび\", \"てわけ\", \"てわたし\", \"でんあつ\", \"てんいん\", \"てんかい\", \"てんき\", \"てんぐ\", \"てんけん\", \"てんごく\", \"てんさい\", \"てんし\", \"てんすう\", \"でんち\", \"てんてき\", \"てんとう\", \"てんない\", \"てんぷら\", \"てんぼうだい\", \"てんめつ\", \"てんらんかい\", \"でんりょく\", \"でんわ\", \"どあい\", \"といれ\", \"どうかん\", \"とうきゅう\", \"どうぐ\", \"とうし\", \"とうむぎ\", \"とおい\", \"とおか\", \"とおく\", \"とおす\", \"とおる\", \"とかい\", \"とかす\", \"ときおり\", \"ときどき\", \"とくい\", \"とくしゅう\", \"とくてん\", \"とくに\", \"とくべつ\", \"とけい\", \"とける\", \"とこや\", \"とさか\", \"としょかん\", \"とそう\", \"とたん\", \"とちゅう\", \"とっきゅう\", \"とっくん\", \"とつぜん\", \"とつにゅう\", \"とどける\", \"ととのえる\", \"とない\", \"となえる\", \"となり\", \"とのさま\", \"とばす\", \"どぶがわ\", \"とほう\", \"とまる\", \"とめる\", \"ともだち\", \"ともる\", \"どようび\", \"とらえる\", \"とんかつ\", \"どんぶり\", \"ないかく\", \"ないこう\", \"ないしょ\", \"ないす\", \"ないせん\", \"ないそう\", \"なおす\", \"ながい\", \"なくす\", \"なげる\", \"なこうど\", \"なさけ\", \"なたでここ\", \"なっとう\", \"なつやすみ\", \"ななおし\", \"なにごと\", \"なにもの\", \"なにわ\", \"なのか\", \"なふだ\", \"なまいき\", \"なまえ\", \"なまみ\", \"なみだ\", \"なめらか\", \"なめる\", \"なやむ\", \"ならう\", \"ならび\", \"ならぶ\", \"なれる\", \"なわとび\", \"なわばり\", \"にあう\", \"にいがた\", \"にうけ\", \"におい\", \"にかい\", \"にがて\", \"にきび\", \"にくしみ\", \"にくまん\", \"にげる\", \"にさんかたんそ\", \"にしき\", \"にせもの\", \"にちじょう\", \"にちようび\", \"にっか\", \"にっき\", \"にっけい\", \"にっこう\", \"にっさん\", \"にっしょく\", \"にっすう\", \"にっせき\", \"にってい\", \"になう\", \"にほん\", \"にまめ\", \"にもつ\", \"にやり\", \"にゅういん\", \"にりんしゃ\", \"にわとり\", \"にんい\", \"にんか\", \"にんき\", \"にんげん\", \"にんしき\", \"にんずう\", \"にんそう\", \"にんたい\", \"にんち\", \"にんてい\", \"にんにく\", \"にんぷ\", \"にんまり\", \"にんむ\", \"にんめい\", \"にんよう\", \"ぬいくぎ\", \"ぬかす\", \"ぬぐいとる\", \"ぬぐう\", \"ぬくもり\", \"ぬすむ\", \"ぬまえび\", \"ぬめり\", \"ぬらす\", \"ぬんちゃく\", \"ねあげ\", \"ねいき\", \"ねいる\", \"ねいろ\", \"ねぐせ\", \"ねくたい\", \"ねくら\", \"ねこぜ\", \"ねこむ\", \"ねさげ\", \"ねすごす\", \"ねそべる\", \"ねだん\", \"ねつい\", \"ねっしん\", \"ねつぞう\", \"ねったいぎょ\", \"ねぶそく\", \"ねふだ\", \"ねぼう\", \"ねほりはほり\", \"ねまき\", \"ねまわし\", \"ねみみ\", \"ねむい\", \"ねむたい\", \"ねもと\", \"ねらう\", \"ねわざ\", \"ねんいり\", \"ねんおし\", \"ねんかん\", \"ねんきん\", \"ねんぐ\", \"ねんざ\", \"ねんし\", \"ねんちゃく\", \"ねんど\", \"ねんぴ\", \"ねんぶつ\", \"ねんまつ\", \"ねんりょう\", \"ねんれい\", \"のいず\", \"のおづま\", \"のがす\", \"のきなみ\", \"のこぎり\", \"のこす\", \"のこる\", \"のせる\", \"のぞく\", \"のぞむ\", \"のたまう\", \"のちほど\", \"のっく\", \"のばす\", \"のはら\", \"のべる\", \"のぼる\", \"のみもの\", \"のやま\", \"のらいぬ\", \"のらねこ\", \"のりもの\", \"のりゆき\", \"のれん\", \"のんき\", \"ばあい\", \"はあく\", \"ばあさん\", \"ばいか\", \"ばいく\", \"はいけん\", \"はいご\", \"はいしん\", \"はいすい\", \"はいせん\", \"はいそう\", \"はいち\", \"ばいばい\", \"はいれつ\", \"はえる\", \"はおる\", \"はかい\", \"ばかり\", \"はかる\", \"はくしゅ\", \"はけん\", \"はこぶ\", \"はさみ\", \"はさん\", \"はしご\", \"ばしょ\", \"はしる\", \"はせる\", \"ぱそこん\", \"はそん\", \"はたん\", \"はちみつ\", \"はつおん\", \"はっかく\", \"はづき\", \"はっきり\", \"はっくつ\", \"はっけん\", \"はっこう\", \"はっさん\", \"はっしん\", \"はったつ\", \"はっちゅう\", \"はってん\", \"はっぴょう\", \"はっぽう\", \"はなす\", \"はなび\", \"はにかむ\", \"はぶらし\", \"はみがき\", \"はむかう\", \"はめつ\", \"はやい\", \"はやし\", \"はらう\", \"はろうぃん\", \"はわい\", \"はんい\", \"はんえい\", \"はんおん\", \"はんかく\", \"はんきょう\", \"ばんぐみ\", \"はんこ\", \"はんしゃ\", \"はんすう\", \"はんだん\", \"ぱんち\", \"ぱんつ\", \"はんてい\", \"はんとし\", \"はんのう\", \"はんぱ\", \"はんぶん\", \"はんぺん\", \"はんぼうき\", \"はんめい\", \"はんらん\", \"はんろん\", \"ひいき\", \"ひうん\", \"ひえる\", \"ひかく\", \"ひかり\", \"ひかる\", \"ひかん\", \"ひくい\", \"ひけつ\", \"ひこうき\", \"ひこく\", \"ひさい\", \"ひさしぶり\", \"ひさん\", \"びじゅつかん\", \"ひしょ\", \"ひそか\", \"ひそむ\", \"ひたむき\", \"ひだり\", \"ひたる\", \"ひつぎ\", \"ひっこし\", \"ひっし\", \"ひつじゅひん\", \"ひっす\", \"ひつぜん\", \"ぴったり\", \"ぴっちり\", \"ひつよう\", \"ひてい\", \"ひとごみ\", \"ひなまつり\", \"ひなん\", \"ひねる\", \"ひはん\", \"ひびく\", \"ひひょう\", \"ひほう\", \"ひまわり\", \"ひまん\", \"ひみつ\", \"ひめい\", \"ひめじし\", \"ひやけ\", \"ひやす\", \"ひよう\", \"びょうき\", \"ひらがな\", \"ひらく\", \"ひりつ\", \"ひりょう\", \"ひるま\", \"ひるやすみ\", \"ひれい\", \"ひろい\", \"ひろう\", \"ひろき\", \"ひろゆき\", \"ひんかく\", \"ひんけつ\", \"ひんこん\", \"ひんしゅ\", \"ひんそう\", \"ぴんち\", \"ひんぱん\", \"びんぼう\", \"ふあん\", \"ふいうち\", \"ふうけい\", \"ふうせん\", \"ぷうたろう\", \"ふうとう\", \"ふうふ\", \"ふえる\", \"ふおん\", \"ふかい\", \"ふきん\", \"ふくざつ\", \"ふくぶくろ\", \"ふこう\", \"ふさい\", \"ふしぎ\", \"ふじみ\", \"ふすま\", \"ふせい\", \"ふせぐ\", \"ふそく\", \"ぶたにく\", \"ふたん\", \"ふちょう\", \"ふつう\", \"ふつか\", \"ふっかつ\", \"ふっき\", \"ふっこく\", \"ぶどう\", \"ふとる\", \"ふとん\", \"ふのう\", \"ふはい\", \"ふひょう\", \"ふへん\", \"ふまん\", \"ふみん\", \"ふめつ\", \"ふめん\", \"ふよう\", \"ふりこ\", \"ふりる\", \"ふるい\", \"ふんいき\", \"ぶんがく\", \"ぶんぐ\", \"ふんしつ\", \"ぶんせき\", \"ふんそう\", \"ぶんぽう\", \"へいあん\", \"へいおん\", \"へいがい\", \"へいき\", \"へいげん\", \"へいこう\", \"へいさ\", \"へいしゃ\", \"へいせつ\", \"へいそ\", \"へいたく\", \"へいてん\", \"へいねつ\", \"へいわ\", \"へきが\", \"へこむ\", \"べにいろ\", \"べにしょうが\", \"へらす\", \"へんかん\", \"べんきょう\", \"べんごし\", \"へんさい\", \"へんたい\", \"べんり\", \"ほあん\", \"ほいく\", \"ぼうぎょ\", \"ほうこく\", \"ほうそう\", \"ほうほう\", \"ほうもん\", \"ほうりつ\", \"ほえる\", \"ほおん\", \"ほかん\", \"ほきょう\", \"ぼきん\", \"ほくろ\", \"ほけつ\", \"ほけん\", \"ほこう\", \"ほこる\", \"ほしい\", \"ほしつ\", \"ほしゅ\", \"ほしょう\", \"ほせい\", \"ほそい\", \"ほそく\", \"ほたて\", \"ほたる\", \"ぽちぶくろ\", \"ほっきょく\", \"ほっさ\", \"ほったん\", \"ほとんど\", \"ほめる\", \"ほんい\", \"ほんき\", \"ほんけ\", \"ほんしつ\", \"ほんやく\", \"まいにち\", \"まかい\", \"まかせる\", \"まがる\", \"まける\", \"まこと\", \"まさつ\", \"まじめ\", \"ますく\", \"まぜる\", \"まつり\", \"まとめ\", \"まなぶ\", \"まぬけ\", \"まねく\", \"まほう\", \"まもる\", \"まゆげ\", \"まよう\", \"まろやか\", \"まわす\", \"まわり\", \"まわる\", \"まんが\", \"まんきつ\", \"まんぞく\", \"まんなか\", \"みいら\", \"みうち\", \"みえる\", \"みがく\", \"みかた\", \"みかん\", \"みけん\", \"みこん\", \"みじかい\", \"みすい\", \"みすえる\", \"みせる\", \"みっか\", \"みつかる\", \"みつける\", \"みてい\", \"みとめる\", \"みなと\", \"みなみかさい\", \"みねらる\", \"みのう\", \"みのがす\", \"みほん\", \"みもと\", \"みやげ\", \"みらい\", \"みりょく\", \"みわく\", \"みんか\", \"みんぞく\", \"むいか\", \"むえき\", \"むえん\", \"むかい\", \"むかう\", \"むかえ\", \"むかし\", \"むぎちゃ\", \"むける\", \"むげん\", \"むさぼる\", \"むしあつい\", \"むしば\", \"むじゅん\", \"むしろ\", \"むすう\", \"むすこ\", \"むすぶ\", \"むすめ\", \"むせる\", \"むせん\", \"むちゅう\", \"むなしい\", \"むのう\", \"むやみ\", \"むよう\", \"むらさき\", \"むりょう\", \"むろん\", \"めいあん\", \"めいうん\", \"めいえん\", \"めいかく\", \"めいきょく\", \"めいさい\", \"めいし\", \"めいそう\", \"めいぶつ\", \"めいれい\", \"めいわく\", \"めぐまれる\", \"めざす\", \"めした\", \"めずらしい\", \"めだつ\", \"めまい\", \"めやす\", \"めんきょ\", \"めんせき\", \"めんどう\", \"もうしあげる\", \"もうどうけん\", \"もえる\", \"もくし\", \"もくてき\", \"もくようび\", \"もちろん\", \"もどる\", \"もらう\", \"もんく\", \"もんだい\", \"やおや\", \"やける\", \"やさい\", \"やさしい\", \"やすい\", \"やすたろう\", \"やすみ\", \"やせる\", \"やそう\", \"やたい\", \"やちん\", \"やっと\", \"やっぱり\", \"やぶる\", \"やめる\", \"ややこしい\", \"やよい\", \"やわらかい\", \"ゆうき\", \"ゆうびんきょく\", \"ゆうべ\", \"ゆうめい\", \"ゆけつ\", \"ゆしゅつ\", \"ゆせん\", \"ゆそう\", \"ゆたか\", \"ゆちゃく\", \"ゆでる\", \"ゆにゅう\", \"ゆびわ\", \"ゆらい\", \"ゆれる\", \"ようい\", \"ようか\", \"ようきゅう\", \"ようじ\", \"ようす\", \"ようちえん\", \"よかぜ\", \"よかん\", \"よきん\", \"よくせい\", \"よくぼう\", \"よけい\", \"よごれる\", \"よさん\", \"よしゅう\", \"よそう\", \"よそく\", \"よっか\", \"よてい\", \"よどがわく\", \"よねつ\", \"よやく\", \"よゆう\", \"よろこぶ\", \"よろしい\", \"らいう\", \"らくがき\", \"らくご\", \"らくさつ\", \"らくだ\", \"らしんばん\", \"らせん\", \"らぞく\", \"らたい\", \"らっか\", \"られつ\", \"りえき\", \"りかい\", \"りきさく\", \"りきせつ\", \"りくぐん\", \"りくつ\", \"りけん\", \"りこう\", \"りせい\", \"りそう\", \"りそく\", \"りてん\", \"りねん\", \"りゆう\", \"りゅうがく\", \"りよう\", \"りょうり\", \"りょかん\", \"りょくちゃ\", \"りょこう\", \"りりく\", \"りれき\", \"りろん\", \"りんご\", \"るいけい\", \"るいさい\", \"るいじ\", \"るいせき\", \"るすばん\", \"るりがわら\", \"れいかん\", \"れいぎ\", \"れいせい\", \"れいぞうこ\", \"れいとう\", \"れいぼう\", \"れきし\", \"れきだい\", \"れんあい\", \"れんけい\", \"れんこん\", \"れんさい\", \"れんしゅう\", \"れんぞく\", \"れんらく\", \"ろうか\", \"ろうご\", \"ろうじん\", \"ろうそく\", \"ろくが\", \"ろこつ\", \"ろじうら\", \"ろしゅつ\", \"ろせん\", \"ろてん\", \"ろめん\", \"ろれつ\", \"ろんぎ\", \"ろんぱ\", \"ろんぶん\", \"ろんり\", \"わかす\", \"わかめ\", \"わかやま\", \"わかれる\", \"わしつ\", \"わじまし\", \"わすれもの\", \"わらう\", \"われる\"]\n    static var koreanWords: [String] = [\"가격\", \"가끔\", \"가난\", \"가능\", \"가득\", \"가르침\", \"가뭄\", \"가방\", \"가상\", \"가슴\", \"가운데\", \"가을\", \"가이드\", \"가입\", \"가장\", \"가정\", \"가족\", \"가죽\", \"각오\", \"각자\", \"간격\", \"간부\", \"간섭\", \"간장\", \"간접\", \"간판\", \"갈등\", \"갈비\", \"갈색\", \"갈증\", \"감각\", \"감기\", \"감소\", \"감수성\", \"감자\", \"감정\", \"갑자기\", \"강남\", \"강당\", \"강도\", \"강력히\", \"강변\", \"강북\", \"강사\", \"강수량\", \"강아지\", \"강원도\", \"강의\", \"강제\", \"강조\", \"같이\", \"개구리\", \"개나리\", \"개방\", \"개별\", \"개선\", \"개성\", \"개인\", \"객관적\", \"거실\", \"거액\", \"거울\", \"거짓\", \"거품\", \"걱정\", \"건강\", \"건물\", \"건설\", \"건조\", \"건축\", \"걸음\", \"검사\", \"검토\", \"게시판\", \"게임\", \"겨울\", \"견해\", \"결과\", \"결국\", \"결론\", \"결석\", \"결승\", \"결심\", \"결정\", \"결혼\", \"경계\", \"경고\", \"경기\", \"경력\", \"경복궁\", \"경비\", \"경상도\", \"경영\", \"경우\", \"경쟁\", \"경제\", \"경주\", \"경찰\", \"경치\", \"경향\", \"경험\", \"계곡\", \"계단\", \"계란\", \"계산\", \"계속\", \"계약\", \"계절\", \"계층\", \"계획\", \"고객\", \"고구려\", \"고궁\", \"고급\", \"고등학생\", \"고무신\", \"고민\", \"고양이\", \"고장\", \"고전\", \"고집\", \"고춧가루\", \"고통\", \"고향\", \"곡식\", \"골목\", \"골짜기\", \"골프\", \"공간\", \"공개\", \"공격\", \"공군\", \"공급\", \"공기\", \"공동\", \"공무원\", \"공부\", \"공사\", \"공식\", \"공업\", \"공연\", \"공원\", \"공장\", \"공짜\", \"공책\", \"공통\", \"공포\", \"공항\", \"공휴일\", \"과목\", \"과일\", \"과장\", \"과정\", \"과학\", \"관객\", \"관계\", \"관광\", \"관념\", \"관람\", \"관련\", \"관리\", \"관습\", \"관심\", \"관점\", \"관찰\", \"광경\", \"광고\", \"광장\", \"광주\", \"괴로움\", \"굉장히\", \"교과서\", \"교문\", \"교복\", \"교실\", \"교양\", \"교육\", \"교장\", \"교직\", \"교통\", \"교환\", \"교훈\", \"구경\", \"구름\", \"구멍\", \"구별\", \"구분\", \"구석\", \"구성\", \"구속\", \"구역\", \"구입\", \"구청\", \"구체적\", \"국가\", \"국기\", \"국내\", \"국립\", \"국물\", \"국민\", \"국수\", \"국어\", \"국왕\", \"국적\", \"국제\", \"국회\", \"군대\", \"군사\", \"군인\", \"궁극적\", \"권리\", \"권위\", \"권투\", \"귀국\", \"귀신\", \"규정\", \"규칙\", \"균형\", \"그날\", \"그냥\", \"그늘\", \"그러나\", \"그룹\", \"그릇\", \"그림\", \"그제서야\", \"그토록\", \"극복\", \"극히\", \"근거\", \"근교\", \"근래\", \"근로\", \"근무\", \"근본\", \"근원\", \"근육\", \"근처\", \"글씨\", \"글자\", \"금강산\", \"금고\", \"금년\", \"금메달\", \"금액\", \"금연\", \"금요일\", \"금지\", \"긍정적\", \"기간\", \"기관\", \"기념\", \"기능\", \"기독교\", \"기둥\", \"기록\", \"기름\", \"기법\", \"기본\", \"기분\", \"기쁨\", \"기숙사\", \"기술\", \"기억\", \"기업\", \"기온\", \"기운\", \"기원\", \"기적\", \"기준\", \"기침\", \"기혼\", \"기획\", \"긴급\", \"긴장\", \"길이\", \"김밥\", \"김치\", \"김포공항\", \"깍두기\", \"깜빡\", \"깨달음\", \"깨소금\", \"껍질\", \"꼭대기\", \"꽃잎\", \"나들이\", \"나란히\", \"나머지\", \"나물\", \"나침반\", \"나흘\", \"낙엽\", \"난방\", \"날개\", \"날씨\", \"날짜\", \"남녀\", \"남대문\", \"남매\", \"남산\", \"남자\", \"남편\", \"남학생\", \"낭비\", \"낱말\", \"내년\", \"내용\", \"내일\", \"냄비\", \"냄새\", \"냇물\", \"냉동\", \"냉면\", \"냉방\", \"냉장고\", \"넥타이\", \"넷째\", \"노동\", \"노란색\", \"노력\", \"노인\", \"녹음\", \"녹차\", \"녹화\", \"논리\", \"논문\", \"논쟁\", \"놀이\", \"농구\", \"농담\", \"농민\", \"농부\", \"농업\", \"농장\", \"농촌\", \"높이\", \"눈동자\", \"눈물\", \"눈썹\", \"뉴욕\", \"느낌\", \"늑대\", \"능동적\", \"능력\", \"다방\", \"다양성\", \"다음\", \"다이어트\", \"다행\", \"단계\", \"단골\", \"단독\", \"단맛\", \"단순\", \"단어\", \"단위\", \"단점\", \"단체\", \"단추\", \"단편\", \"단풍\", \"달걀\", \"달러\", \"달력\", \"달리\", \"닭고기\", \"담당\", \"담배\", \"담요\", \"담임\", \"답변\", \"답장\", \"당근\", \"당분간\", \"당연히\", \"당장\", \"대규모\", \"대낮\", \"대단히\", \"대답\", \"대도시\", \"대략\", \"대량\", \"대륙\", \"대문\", \"대부분\", \"대신\", \"대응\", \"대장\", \"대전\", \"대접\", \"대중\", \"대책\", \"대출\", \"대충\", \"대통령\", \"대학\", \"대한민국\", \"대합실\", \"대형\", \"덩어리\", \"데이트\", \"도대체\", \"도덕\", \"도둑\", \"도망\", \"도서관\", \"도심\", \"도움\", \"도입\", \"도자기\", \"도저히\", \"도전\", \"도중\", \"도착\", \"독감\", \"독립\", \"독서\", \"독일\", \"독창적\", \"동화책\", \"뒷모습\", \"뒷산\", \"딸아이\", \"마누라\", \"마늘\", \"마당\", \"마라톤\", \"마련\", \"마무리\", \"마사지\", \"마약\", \"마요네즈\", \"마을\", \"마음\", \"마이크\", \"마중\", \"마지막\", \"마찬가지\", \"마찰\", \"마흔\", \"막걸리\", \"막내\", \"막상\", \"만남\", \"만두\", \"만세\", \"만약\", \"만일\", \"만점\", \"만족\", \"만화\", \"많이\", \"말기\", \"말씀\", \"말투\", \"맘대로\", \"망원경\", \"매년\", \"매달\", \"매력\", \"매번\", \"매스컴\", \"매일\", \"매장\", \"맥주\", \"먹이\", \"먼저\", \"먼지\", \"멀리\", \"메일\", \"며느리\", \"며칠\", \"면담\", \"멸치\", \"명단\", \"명령\", \"명예\", \"명의\", \"명절\", \"명칭\", \"명함\", \"모금\", \"모니터\", \"모델\", \"모든\", \"모범\", \"모습\", \"모양\", \"모임\", \"모조리\", \"모집\", \"모퉁이\", \"목걸이\", \"목록\", \"목사\", \"목소리\", \"목숨\", \"목적\", \"목표\", \"몰래\", \"몸매\", \"몸무게\", \"몸살\", \"몸속\", \"몸짓\", \"몸통\", \"몹시\", \"무관심\", \"무궁화\", \"무더위\", \"무덤\", \"무릎\", \"무슨\", \"무엇\", \"무역\", \"무용\", \"무조건\", \"무지개\", \"무척\", \"문구\", \"문득\", \"문법\", \"문서\", \"문제\", \"문학\", \"문화\", \"물가\", \"물건\", \"물결\", \"물고기\", \"물론\", \"물리학\", \"물음\", \"물질\", \"물체\", \"미국\", \"미디어\", \"미사일\", \"미술\", \"미역\", \"미용실\", \"미움\", \"미인\", \"미팅\", \"미혼\", \"민간\", \"민족\", \"민주\", \"믿음\", \"밀가루\", \"밀리미터\", \"밑바닥\", \"바가지\", \"바구니\", \"바나나\", \"바늘\", \"바닥\", \"바닷가\", \"바람\", \"바이러스\", \"바탕\", \"박물관\", \"박사\", \"박수\", \"반대\", \"반드시\", \"반말\", \"반발\", \"반성\", \"반응\", \"반장\", \"반죽\", \"반지\", \"반찬\", \"받침\", \"발가락\", \"발걸음\", \"발견\", \"발달\", \"발레\", \"발목\", \"발바닥\", \"발생\", \"발음\", \"발자국\", \"발전\", \"발톱\", \"발표\", \"밤하늘\", \"밥그릇\", \"밥맛\", \"밥상\", \"밥솥\", \"방금\", \"방면\", \"방문\", \"방바닥\", \"방법\", \"방송\", \"방식\", \"방안\", \"방울\", \"방지\", \"방학\", \"방해\", \"방향\", \"배경\", \"배꼽\", \"배달\", \"배드민턴\", \"백두산\", \"백색\", \"백성\", \"백인\", \"백제\", \"백화점\", \"버릇\", \"버섯\", \"버튼\", \"번개\", \"번역\", \"번지\", \"번호\", \"벌금\", \"벌레\", \"벌써\", \"범위\", \"범인\", \"범죄\", \"법률\", \"법원\", \"법적\", \"법칙\", \"베이징\", \"벨트\", \"변경\", \"변동\", \"변명\", \"변신\", \"변호사\", \"변화\", \"별도\", \"별명\", \"별일\", \"병실\", \"병아리\", \"병원\", \"보관\", \"보너스\", \"보라색\", \"보람\", \"보름\", \"보상\", \"보안\", \"보자기\", \"보장\", \"보전\", \"보존\", \"보통\", \"보편적\", \"보험\", \"복도\", \"복사\", \"복숭아\", \"복습\", \"볶음\", \"본격적\", \"본래\", \"본부\", \"본사\", \"본성\", \"본인\", \"본질\", \"볼펜\", \"봉사\", \"봉지\", \"봉투\", \"부근\", \"부끄러움\", \"부담\", \"부동산\", \"부문\", \"부분\", \"부산\", \"부상\", \"부엌\", \"부인\", \"부작용\", \"부장\", \"부정\", \"부족\", \"부지런히\", \"부친\", \"부탁\", \"부품\", \"부회장\", \"북부\", \"북한\", \"분노\", \"분량\", \"분리\", \"분명\", \"분석\", \"분야\", \"분위기\", \"분필\", \"분홍색\", \"불고기\", \"불과\", \"불교\", \"불꽃\", \"불만\", \"불법\", \"불빛\", \"불안\", \"불이익\", \"불행\", \"브랜드\", \"비극\", \"비난\", \"비닐\", \"비둘기\", \"비디오\", \"비로소\", \"비만\", \"비명\", \"비밀\", \"비바람\", \"비빔밥\", \"비상\", \"비용\", \"비율\", \"비중\", \"비타민\", \"비판\", \"빌딩\", \"빗물\", \"빗방울\", \"빗줄기\", \"빛깔\", \"빨간색\", \"빨래\", \"빨리\", \"사건\", \"사계절\", \"사나이\", \"사냥\", \"사람\", \"사랑\", \"사립\", \"사모님\", \"사물\", \"사방\", \"사상\", \"사생활\", \"사설\", \"사슴\", \"사실\", \"사업\", \"사용\", \"사월\", \"사장\", \"사전\", \"사진\", \"사촌\", \"사춘기\", \"사탕\", \"사투리\", \"사흘\", \"산길\", \"산부인과\", \"산업\", \"산책\", \"살림\", \"살인\", \"살짝\", \"삼계탕\", \"삼국\", \"삼십\", \"삼월\", \"삼촌\", \"상관\", \"상금\", \"상대\", \"상류\", \"상반기\", \"상상\", \"상식\", \"상업\", \"상인\", \"상자\", \"상점\", \"상처\", \"상추\", \"상태\", \"상표\", \"상품\", \"상황\", \"새벽\", \"색깔\", \"색연필\", \"생각\", \"생명\", \"생물\", \"생방송\", \"생산\", \"생선\", \"생신\", \"생일\", \"생활\", \"서랍\", \"서른\", \"서명\", \"서민\", \"서비스\", \"서양\", \"서울\", \"서적\", \"서점\", \"서쪽\", \"서클\", \"석사\", \"석유\", \"선거\", \"선물\", \"선배\", \"선생\", \"선수\", \"선원\", \"선장\", \"선전\", \"선택\", \"선풍기\", \"설거지\", \"설날\", \"설렁탕\", \"설명\", \"설문\", \"설사\", \"설악산\", \"설치\", \"설탕\", \"섭씨\", \"성공\", \"성당\", \"성명\", \"성별\", \"성인\", \"성장\", \"성적\", \"성질\", \"성함\", \"세금\", \"세미나\", \"세상\", \"세월\", \"세종대왕\", \"세탁\", \"센터\", \"센티미터\", \"셋째\", \"소규모\", \"소극적\", \"소금\", \"소나기\", \"소년\", \"소득\", \"소망\", \"소문\", \"소설\", \"소속\", \"소아과\", \"소용\", \"소원\", \"소음\", \"소중히\", \"소지품\", \"소질\", \"소풍\", \"소형\", \"속담\", \"속도\", \"속옷\", \"손가락\", \"손길\", \"손녀\", \"손님\", \"손등\", \"손목\", \"손뼉\", \"손실\", \"손질\", \"손톱\", \"손해\", \"솔직히\", \"솜씨\", \"송아지\", \"송이\", \"송편\", \"쇠고기\", \"쇼핑\", \"수건\", \"수년\", \"수단\", \"수돗물\", \"수동적\", \"수면\", \"수명\", \"수박\", \"수상\", \"수석\", \"수술\", \"수시로\", \"수업\", \"수염\", \"수영\", \"수입\", \"수준\", \"수집\", \"수출\", \"수컷\", \"수필\", \"수학\", \"수험생\", \"수화기\", \"숙녀\", \"숙소\", \"숙제\", \"순간\", \"순서\", \"순수\", \"순식간\", \"순위\", \"숟가락\", \"술병\", \"술집\", \"숫자\", \"스님\", \"스물\", \"스스로\", \"스승\", \"스웨터\", \"스위치\", \"스케이트\", \"스튜디오\", \"스트레스\", \"스포츠\", \"슬쩍\", \"슬픔\", \"습관\", \"습기\", \"승객\", \"승리\", \"승부\", \"승용차\", \"승진\", \"시각\", \"시간\", \"시골\", \"시금치\", \"시나리오\", \"시댁\", \"시리즈\", \"시멘트\", \"시민\", \"시부모\", \"시선\", \"시설\", \"시스템\", \"시아버지\", \"시어머니\", \"시월\", \"시인\", \"시일\", \"시작\", \"시장\", \"시절\", \"시점\", \"시중\", \"시즌\", \"시집\", \"시청\", \"시합\", \"시험\", \"식구\", \"식기\", \"식당\", \"식량\", \"식료품\", \"식물\", \"식빵\", \"식사\", \"식생활\", \"식초\", \"식탁\", \"식품\", \"신고\", \"신규\", \"신념\", \"신문\", \"신발\", \"신비\", \"신사\", \"신세\", \"신용\", \"신제품\", \"신청\", \"신체\", \"신화\", \"실감\", \"실내\", \"실력\", \"실례\", \"실망\", \"실수\", \"실습\", \"실시\", \"실장\", \"실정\", \"실질적\", \"실천\", \"실체\", \"실컷\", \"실태\", \"실패\", \"실험\", \"실현\", \"심리\", \"심부름\", \"심사\", \"심장\", \"심정\", \"심판\", \"쌍둥이\", \"씨름\", \"씨앗\", \"아가씨\", \"아나운서\", \"아드님\", \"아들\", \"아쉬움\", \"아스팔트\", \"아시아\", \"아울러\", \"아저씨\", \"아줌마\", \"아직\", \"아침\", \"아파트\", \"아프리카\", \"아픔\", \"아홉\", \"아흔\", \"악기\", \"악몽\", \"악수\", \"안개\", \"안경\", \"안과\", \"안내\", \"안녕\", \"안동\", \"안방\", \"안부\", \"안주\", \"알루미늄\", \"알코올\", \"암시\", \"암컷\", \"압력\", \"앞날\", \"앞문\", \"애인\", \"애정\", \"액수\", \"앨범\", \"야간\", \"야단\", \"야옹\", \"약간\", \"약국\", \"약속\", \"약수\", \"약점\", \"약품\", \"약혼녀\", \"양념\", \"양력\", \"양말\", \"양배추\", \"양주\", \"양파\", \"어둠\", \"어려움\", \"어른\", \"어젯밤\", \"어쨌든\", \"어쩌다가\", \"어쩐지\", \"언니\", \"언덕\", \"언론\", \"언어\", \"얼굴\", \"얼른\", \"얼음\", \"얼핏\", \"엄마\", \"업무\", \"업종\", \"업체\", \"엉덩이\", \"엉망\", \"엉터리\", \"엊그제\", \"에너지\", \"에어컨\", \"엔진\", \"여건\", \"여고생\", \"여관\", \"여군\", \"여권\", \"여대생\", \"여덟\", \"여동생\", \"여든\", \"여론\", \"여름\", \"여섯\", \"여성\", \"여왕\", \"여인\", \"여전히\", \"여직원\", \"여학생\", \"여행\", \"역사\", \"역시\", \"역할\", \"연결\", \"연구\", \"연극\", \"연기\", \"연락\", \"연설\", \"연세\", \"연속\", \"연습\", \"연애\", \"연예인\", \"연인\", \"연장\", \"연주\", \"연출\", \"연필\", \"연합\", \"연휴\", \"열기\", \"열매\", \"열쇠\", \"열심히\", \"열정\", \"열차\", \"열흘\", \"염려\", \"엽서\", \"영국\", \"영남\", \"영상\", \"영양\", \"영역\", \"영웅\", \"영원히\", \"영하\", \"영향\", \"영혼\", \"영화\", \"옆구리\", \"옆방\", \"옆집\", \"예감\", \"예금\", \"예방\", \"예산\", \"예상\", \"예선\", \"예술\", \"예습\", \"예식장\", \"예약\", \"예전\", \"예절\", \"예정\", \"예컨대\", \"옛날\", \"오늘\", \"오락\", \"오랫동안\", \"오렌지\", \"오로지\", \"오른발\", \"오븐\", \"오십\", \"오염\", \"오월\", \"오전\", \"오직\", \"오징어\", \"오페라\", \"오피스텔\", \"오히려\", \"옥상\", \"옥수수\", \"온갖\", \"온라인\", \"온몸\", \"온종일\", \"온통\", \"올가을\", \"올림픽\", \"올해\", \"옷차림\", \"와이셔츠\", \"와인\", \"완성\", \"완전\", \"왕비\", \"왕자\", \"왜냐하면\", \"왠지\", \"외갓집\", \"외국\", \"외로움\", \"외삼촌\", \"외출\", \"외침\", \"외할머니\", \"왼발\", \"왼손\", \"왼쪽\", \"요금\", \"요일\", \"요즘\", \"요청\", \"용기\", \"용서\", \"용어\", \"우산\", \"우선\", \"우승\", \"우연히\", \"우정\", \"우체국\", \"우편\", \"운동\", \"운명\", \"운반\", \"운전\", \"운행\", \"울산\", \"울음\", \"움직임\", \"웃어른\", \"웃음\", \"워낙\", \"원고\", \"원래\", \"원서\", \"원숭이\", \"원인\", \"원장\", \"원피스\", \"월급\", \"월드컵\", \"월세\", \"월요일\", \"웨이터\", \"위반\", \"위법\", \"위성\", \"위원\", \"위험\", \"위협\", \"윗사람\", \"유난히\", \"유럽\", \"유명\", \"유물\", \"유산\", \"유적\", \"유치원\", \"유학\", \"유행\", \"유형\", \"육군\", \"육상\", \"육십\", \"육체\", \"은행\", \"음력\", \"음료\", \"음반\", \"음성\", \"음식\", \"음악\", \"음주\", \"의견\", \"의논\", \"의문\", \"의복\", \"의식\", \"의심\", \"의외로\", \"의욕\", \"의원\", \"의학\", \"이것\", \"이곳\", \"이념\", \"이놈\", \"이달\", \"이대로\", \"이동\", \"이렇게\", \"이력서\", \"이론적\", \"이름\", \"이민\", \"이발소\", \"이별\", \"이불\", \"이빨\", \"이상\", \"이성\", \"이슬\", \"이야기\", \"이용\", \"이웃\", \"이월\", \"이윽고\", \"이익\", \"이전\", \"이중\", \"이튿날\", \"이틀\", \"이혼\", \"인간\", \"인격\", \"인공\", \"인구\", \"인근\", \"인기\", \"인도\", \"인류\", \"인물\", \"인생\", \"인쇄\", \"인연\", \"인원\", \"인재\", \"인종\", \"인천\", \"인체\", \"인터넷\", \"인하\", \"인형\", \"일곱\", \"일기\", \"일단\", \"일대\", \"일등\", \"일반\", \"일본\", \"일부\", \"일상\", \"일생\", \"일손\", \"일요일\", \"일월\", \"일정\", \"일종\", \"일주일\", \"일찍\", \"일체\", \"일치\", \"일행\", \"일회용\", \"임금\", \"임무\", \"입대\", \"입력\", \"입맛\", \"입사\", \"입술\", \"입시\", \"입원\", \"입장\", \"입학\", \"자가용\", \"자격\", \"자극\", \"자동\", \"자랑\", \"자부심\", \"자식\", \"자신\", \"자연\", \"자원\", \"자율\", \"자전거\", \"자정\", \"자존심\", \"자판\", \"작가\", \"작년\", \"작성\", \"작업\", \"작용\", \"작은딸\", \"작품\", \"잔디\", \"잔뜩\", \"잔치\", \"잘못\", \"잠깐\", \"잠수함\", \"잠시\", \"잠옷\", \"잠자리\", \"잡지\", \"장관\", \"장군\", \"장기간\", \"장래\", \"장례\", \"장르\", \"장마\", \"장면\", \"장모\", \"장미\", \"장비\", \"장사\", \"장소\", \"장식\", \"장애인\", \"장인\", \"장점\", \"장차\", \"장학금\", \"재능\", \"재빨리\", \"재산\", \"재생\", \"재작년\", \"재정\", \"재채기\", \"재판\", \"재학\", \"재활용\", \"저것\", \"저고리\", \"저곳\", \"저녁\", \"저런\", \"저렇게\", \"저번\", \"저울\", \"저절로\", \"저축\", \"적극\", \"적당히\", \"적성\", \"적용\", \"적응\", \"전개\", \"전공\", \"전기\", \"전달\", \"전라도\", \"전망\", \"전문\", \"전반\", \"전부\", \"전세\", \"전시\", \"전용\", \"전자\", \"전쟁\", \"전주\", \"전철\", \"전체\", \"전통\", \"전혀\", \"전후\", \"절대\", \"절망\", \"절반\", \"절약\", \"절차\", \"점검\", \"점수\", \"점심\", \"점원\", \"점점\", \"점차\", \"접근\", \"접시\", \"접촉\", \"젓가락\", \"정거장\", \"정도\", \"정류장\", \"정리\", \"정말\", \"정면\", \"정문\", \"정반대\", \"정보\", \"정부\", \"정비\", \"정상\", \"정성\", \"정오\", \"정원\", \"정장\", \"정지\", \"정치\", \"정확히\", \"제공\", \"제과점\", \"제대로\", \"제목\", \"제발\", \"제법\", \"제삿날\", \"제안\", \"제일\", \"제작\", \"제주도\", \"제출\", \"제품\", \"제한\", \"조각\", \"조건\", \"조금\", \"조깅\", \"조명\", \"조미료\", \"조상\", \"조선\", \"조용히\", \"조절\", \"조정\", \"조직\", \"존댓말\", \"존재\", \"졸업\", \"졸음\", \"종교\", \"종로\", \"종류\", \"종소리\", \"종업원\", \"종종\", \"종합\", \"좌석\", \"죄인\", \"주관적\", \"주름\", \"주말\", \"주머니\", \"주먹\", \"주문\", \"주민\", \"주방\", \"주변\", \"주식\", \"주인\", \"주일\", \"주장\", \"주전자\", \"주택\", \"준비\", \"줄거리\", \"줄기\", \"줄무늬\", \"중간\", \"중계방송\", \"중국\", \"중년\", \"중단\", \"중독\", \"중반\", \"중부\", \"중세\", \"중소기업\", \"중순\", \"중앙\", \"중요\", \"중학교\", \"즉석\", \"즉시\", \"즐거움\", \"증가\", \"증거\", \"증권\", \"증상\", \"증세\", \"지각\", \"지갑\", \"지경\", \"지극히\", \"지금\", \"지급\", \"지능\", \"지름길\", \"지리산\", \"지방\", \"지붕\", \"지식\", \"지역\", \"지우개\", \"지원\", \"지적\", \"지점\", \"지진\", \"지출\", \"직선\", \"직업\", \"직원\", \"직장\", \"진급\", \"진동\", \"진로\", \"진료\", \"진리\", \"진짜\", \"진찰\", \"진출\", \"진통\", \"진행\", \"질문\", \"질병\", \"질서\", \"짐작\", \"집단\", \"집안\", \"집중\", \"짜증\", \"찌꺼기\", \"차남\", \"차라리\", \"차량\", \"차림\", \"차별\", \"차선\", \"차츰\", \"착각\", \"찬물\", \"찬성\", \"참가\", \"참기름\", \"참새\", \"참석\", \"참여\", \"참외\", \"참조\", \"찻잔\", \"창가\", \"창고\", \"창구\", \"창문\", \"창밖\", \"창작\", \"창조\", \"채널\", \"채점\", \"책가방\", \"책방\", \"책상\", \"책임\", \"챔피언\", \"처벌\", \"처음\", \"천국\", \"천둥\", \"천장\", \"천재\", \"천천히\", \"철도\", \"철저히\", \"철학\", \"첫날\", \"첫째\", \"청년\", \"청바지\", \"청소\", \"청춘\", \"체계\", \"체력\", \"체온\", \"체육\", \"체중\", \"체험\", \"초등학생\", \"초반\", \"초밥\", \"초상화\", \"초순\", \"초여름\", \"초원\", \"초저녁\", \"초점\", \"초청\", \"초콜릿\", \"촛불\", \"총각\", \"총리\", \"총장\", \"촬영\", \"최근\", \"최상\", \"최선\", \"최신\", \"최악\", \"최종\", \"추석\", \"추억\", \"추진\", \"추천\", \"추측\", \"축구\", \"축소\", \"축제\", \"축하\", \"출근\", \"출발\", \"출산\", \"출신\", \"출연\", \"출입\", \"출장\", \"출판\", \"충격\", \"충고\", \"충돌\", \"충분히\", \"충청도\", \"취업\", \"취직\", \"취향\", \"치약\", \"친구\", \"친척\", \"칠십\", \"칠월\", \"칠판\", \"침대\", \"침묵\", \"침실\", \"칫솔\", \"칭찬\", \"카메라\", \"카운터\", \"칼국수\", \"캐릭터\", \"캠퍼스\", \"캠페인\", \"커튼\", \"컨디션\", \"컬러\", \"컴퓨터\", \"코끼리\", \"코미디\", \"콘서트\", \"콜라\", \"콤플렉스\", \"콩나물\", \"쾌감\", \"쿠데타\", \"크림\", \"큰길\", \"큰딸\", \"큰소리\", \"큰아들\", \"큰어머니\", \"큰일\", \"큰절\", \"클래식\", \"클럽\", \"킬로\", \"타입\", \"타자기\", \"탁구\", \"탁자\", \"탄생\", \"태권도\", \"태양\", \"태풍\", \"택시\", \"탤런트\", \"터널\", \"터미널\", \"테니스\", \"테스트\", \"테이블\", \"텔레비전\", \"토론\", \"토마토\", \"토요일\", \"통계\", \"통과\", \"통로\", \"통신\", \"통역\", \"통일\", \"통장\", \"통제\", \"통증\", \"통합\", \"통화\", \"퇴근\", \"퇴원\", \"퇴직금\", \"튀김\", \"트럭\", \"특급\", \"특별\", \"특성\", \"특수\", \"특징\", \"특히\", \"튼튼히\", \"티셔츠\", \"파란색\", \"파일\", \"파출소\", \"판결\", \"판단\", \"판매\", \"판사\", \"팔십\", \"팔월\", \"팝송\", \"패션\", \"팩스\", \"팩시밀리\", \"팬티\", \"퍼센트\", \"페인트\", \"편견\", \"편의\", \"편지\", \"편히\", \"평가\", \"평균\", \"평생\", \"평소\", \"평양\", \"평일\", \"평화\", \"포스터\", \"포인트\", \"포장\", \"포함\", \"표면\", \"표정\", \"표준\", \"표현\", \"품목\", \"품질\", \"풍경\", \"풍속\", \"풍습\", \"프랑스\", \"프린터\", \"플라스틱\", \"피곤\", \"피망\", \"피아노\", \"필름\", \"필수\", \"필요\", \"필자\", \"필통\", \"핑계\", \"하느님\", \"하늘\", \"하드웨어\", \"하룻밤\", \"하반기\", \"하숙집\", \"하순\", \"하여튼\", \"하지만\", \"하천\", \"하품\", \"하필\", \"학과\", \"학교\", \"학급\", \"학기\", \"학년\", \"학력\", \"학번\", \"학부모\", \"학비\", \"학생\", \"학술\", \"학습\", \"학용품\", \"학원\", \"학위\", \"학자\", \"학점\", \"한계\", \"한글\", \"한꺼번에\", \"한낮\", \"한눈\", \"한동안\", \"한때\", \"한라산\", \"한마디\", \"한문\", \"한번\", \"한복\", \"한식\", \"한여름\", \"한쪽\", \"할머니\", \"할아버지\", \"할인\", \"함께\", \"함부로\", \"합격\", \"합리적\", \"항공\", \"항구\", \"항상\", \"항의\", \"해결\", \"해군\", \"해답\", \"해당\", \"해물\", \"해석\", \"해설\", \"해수욕장\", \"해안\", \"핵심\", \"핸드백\", \"햄버거\", \"햇볕\", \"햇살\", \"행동\", \"행복\", \"행사\", \"행운\", \"행위\", \"향기\", \"향상\", \"향수\", \"허락\", \"허용\", \"헬기\", \"현관\", \"현금\", \"현대\", \"현상\", \"현실\", \"현장\", \"현재\", \"현지\", \"혈액\", \"협력\", \"형부\", \"형사\", \"형수\", \"형식\", \"형제\", \"형태\", \"형편\", \"혜택\", \"호기심\", \"호남\", \"호랑이\", \"호박\", \"호텔\", \"호흡\", \"혹시\", \"홀로\", \"홈페이지\", \"홍보\", \"홍수\", \"홍차\", \"화면\", \"화분\", \"화살\", \"화요일\", \"화장\", \"화학\", \"확보\", \"확인\", \"확장\", \"확정\", \"환갑\", \"환경\", \"환영\", \"환율\", \"환자\", \"활기\", \"활동\", \"활발히\", \"활용\", \"활짝\", \"회견\", \"회관\", \"회복\", \"회색\", \"회원\", \"회장\", \"회전\", \"횟수\", \"횡단보도\", \"효율적\", \"후반\", \"후춧가루\", \"훈련\", \"훨씬\", \"휴식\", \"휴일\", \"흉내\", \"흐름\", \"흑백\", \"흑인\", \"흔적\", \"흔히\", \"흥미\", \"흥분\", \"희곡\", \"희망\", \"희생\", \"흰색\", \"힘껏\"]\n    static var spanishWords: [String] = [\"ábaco\", \"abdomen\", \"abeja\", \"abierto\", \"abogado\", \"abono\", \"aborto\", \"abrazo\", \"abrir\", \"abuelo\", \"abuso\", \"acabar\", \"academia\", \"acceso\", \"acción\", \"aceite\", \"acelga\", \"acento\", \"aceptar\", \"ácido\", \"aclarar\", \"acné\", \"acoger\", \"acoso\", \"activo\", \"acto\", \"actriz\", \"actuar\", \"acudir\", \"acuerdo\", \"acusar\", \"adicto\", \"admitir\", \"adoptar\", \"adorno\", \"aduana\", \"adulto\", \"aéreo\", \"afectar\", \"afición\", \"afinar\", \"afirmar\", \"ágil\", \"agitar\", \"agonía\", \"agosto\", \"agotar\", \"agregar\", \"agrio\", \"agua\", \"agudo\", \"águila\", \"aguja\", \"ahogo\", \"ahorro\", \"aire\", \"aislar\", \"ajedrez\", \"ajeno\", \"ajuste\", \"alacrán\", \"alambre\", \"alarma\", \"alba\", \"álbum\", \"alcalde\", \"aldea\", \"alegre\", \"alejar\", \"alerta\", \"aleta\", \"alfiler\", \"alga\", \"algodón\", \"aliado\", \"aliento\", \"alivio\", \"alma\", \"almeja\", \"almíbar\", \"altar\", \"alteza\", \"altivo\", \"alto\", \"altura\", \"alumno\", \"alzar\", \"amable\", \"amante\", \"amapola\", \"amargo\", \"amasar\", \"ámbar\", \"ámbito\", \"ameno\", \"amigo\", \"amistad\", \"amor\", \"amparo\", \"amplio\", \"ancho\", \"anciano\", \"ancla\", \"andar\", \"andén\", \"anemia\", \"ángulo\", \"anillo\", \"ánimo\", \"anís\", \"anotar\", \"antena\", \"antiguo\", \"antojo\", \"anual\", \"anular\", \"anuncio\", \"añadir\", \"añejo\", \"año\", \"apagar\", \"aparato\", \"apetito\", \"apio\", \"aplicar\", \"apodo\", \"aporte\", \"apoyo\", \"aprender\", \"aprobar\", \"apuesta\", \"apuro\", \"arado\", \"araña\", \"arar\", \"árbitro\", \"árbol\", \"arbusto\", \"archivo\", \"arco\", \"arder\", \"ardilla\", \"arduo\", \"área\", \"árido\", \"aries\", \"armonía\", \"arnés\", \"aroma\", \"arpa\", \"arpón\", \"arreglo\", \"arroz\", \"arruga\", \"arte\", \"artista\", \"asa\", \"asado\", \"asalto\", \"ascenso\", \"asegurar\", \"aseo\", \"asesor\", \"asiento\", \"asilo\", \"asistir\", \"asno\", \"asombro\", \"áspero\", \"astilla\", \"astro\", \"astuto\", \"asumir\", \"asunto\", \"atajo\", \"ataque\", \"atar\", \"atento\", \"ateo\", \"ático\", \"atleta\", \"átomo\", \"atraer\", \"atroz\", \"atún\", \"audaz\", \"audio\", \"auge\", \"aula\", \"aumento\", \"ausente\", \"autor\", \"aval\", \"avance\", \"avaro\", \"ave\", \"avellana\", \"avena\", \"avestruz\", \"avión\", \"aviso\", \"ayer\", \"ayuda\", \"ayuno\", \"azafrán\", \"azar\", \"azote\", \"azúcar\", \"azufre\", \"azul\", \"baba\", \"babor\", \"bache\", \"bahía\", \"baile\", \"bajar\", \"balanza\", \"balcón\", \"balde\", \"bambú\", \"banco\", \"banda\", \"baño\", \"barba\", \"barco\", \"barniz\", \"barro\", \"báscula\", \"bastón\", \"basura\", \"batalla\", \"batería\", \"batir\", \"batuta\", \"baúl\", \"bazar\", \"bebé\", \"bebida\", \"bello\", \"besar\", \"beso\", \"bestia\", \"bicho\", \"bien\", \"bingo\", \"blanco\", \"bloque\", \"blusa\", \"boa\", \"bobina\", \"bobo\", \"boca\", \"bocina\", \"boda\", \"bodega\", \"boina\", \"bola\", \"bolero\", \"bolsa\", \"bomba\", \"bondad\", \"bonito\", \"bono\", \"bonsái\", \"borde\", \"borrar\", \"bosque\", \"bote\", \"botín\", \"bóveda\", \"bozal\", \"bravo\", \"brazo\", \"brecha\", \"breve\", \"brillo\", \"brinco\", \"brisa\", \"broca\", \"broma\", \"bronce\", \"brote\", \"bruja\", \"brusco\", \"bruto\", \"buceo\", \"bucle\", \"bueno\", \"buey\", \"bufanda\", \"bufón\", \"búho\", \"buitre\", \"bulto\", \"burbuja\", \"burla\", \"burro\", \"buscar\", \"butaca\", \"buzón\", \"caballo\", \"cabeza\", \"cabina\", \"cabra\", \"cacao\", \"cadáver\", \"cadena\", \"caer\", \"café\", \"caída\", \"caimán\", \"caja\", \"cajón\", \"cal\", \"calamar\", \"calcio\", \"caldo\", \"calidad\", \"calle\", \"calma\", \"calor\", \"calvo\", \"cama\", \"cambio\", \"camello\", \"camino\", \"campo\", \"cáncer\", \"candil\", \"canela\", \"canguro\", \"canica\", \"canto\", \"caña\", \"cañón\", \"caoba\", \"caos\", \"capaz\", \"capitán\", \"capote\", \"captar\", \"capucha\", \"cara\", \"carbón\", \"cárcel\", \"careta\", \"carga\", \"cariño\", \"carne\", \"carpeta\", \"carro\", \"carta\", \"casa\", \"casco\", \"casero\", \"caspa\", \"castor\", \"catorce\", \"catre\", \"caudal\", \"causa\", \"cazo\", \"cebolla\", \"ceder\", \"cedro\", \"celda\", \"célebre\", \"celoso\", \"célula\", \"cemento\", \"ceniza\", \"centro\", \"cerca\", \"cerdo\", \"cereza\", \"cero\", \"cerrar\", \"certeza\", \"césped\", \"cetro\", \"chacal\", \"chaleco\", \"champú\", \"chancla\", \"chapa\", \"charla\", \"chico\", \"chiste\", \"chivo\", \"choque\", \"choza\", \"chuleta\", \"chupar\", \"ciclón\", \"ciego\", \"cielo\", \"cien\", \"cierto\", \"cifra\", \"cigarro\", \"cima\", \"cinco\", \"cine\", \"cinta\", \"ciprés\", \"circo\", \"ciruela\", \"cisne\", \"cita\", \"ciudad\", \"clamor\", \"clan\", \"claro\", \"clase\", \"clave\", \"cliente\", \"clima\", \"clínica\", \"cobre\", \"cocción\", \"cochino\", \"cocina\", \"coco\", \"código\", \"codo\", \"cofre\", \"coger\", \"cohete\", \"cojín\", \"cojo\", \"cola\", \"colcha\", \"colegio\", \"colgar\", \"colina\", \"collar\", \"colmo\", \"columna\", \"combate\", \"comer\", \"comida\", \"cómodo\", \"compra\", \"conde\", \"conejo\", \"conga\", \"conocer\", \"consejo\", \"contar\", \"copa\", \"copia\", \"corazón\", \"corbata\", \"corcho\", \"cordón\", \"corona\", \"correr\", \"coser\", \"cosmos\", \"costa\", \"cráneo\", \"cráter\", \"crear\", \"crecer\", \"creído\", \"crema\", \"cría\", \"crimen\", \"cripta\", \"crisis\", \"cromo\", \"crónica\", \"croqueta\", \"crudo\", \"cruz\", \"cuadro\", \"cuarto\", \"cuatro\", \"cubo\", \"cubrir\", \"cuchara\", \"cuello\", \"cuento\", \"cuerda\", \"cuesta\", \"cueva\", \"cuidar\", \"culebra\", \"culpa\", \"culto\", \"cumbre\", \"cumplir\", \"cuna\", \"cuneta\", \"cuota\", \"cupón\", \"cúpula\", \"curar\", \"curioso\", \"curso\", \"curva\", \"cutis\", \"dama\", \"danza\", \"dar\", \"dardo\", \"dátil\", \"deber\", \"débil\", \"década\", \"decir\", \"dedo\", \"defensa\", \"definir\", \"dejar\", \"delfín\", \"delgado\", \"delito\", \"demora\", \"denso\", \"dental\", \"deporte\", \"derecho\", \"derrota\", \"desayuno\", \"deseo\", \"desfile\", \"desnudo\", \"destino\", \"desvío\", \"detalle\", \"detener\", \"deuda\", \"día\", \"diablo\", \"diadema\", \"diamante\", \"diana\", \"diario\", \"dibujo\", \"dictar\", \"diente\", \"dieta\", \"diez\", \"difícil\", \"digno\", \"dilema\", \"diluir\", \"dinero\", \"directo\", \"dirigir\", \"disco\", \"diseño\", \"disfraz\", \"diva\", \"divino\", \"doble\", \"doce\", \"dolor\", \"domingo\", \"don\", \"donar\", \"dorado\", \"dormir\", \"dorso\", \"dos\", \"dosis\", \"dragón\", \"droga\", \"ducha\", \"duda\", \"duelo\", \"dueño\", \"dulce\", \"dúo\", \"duque\", \"durar\", \"dureza\", \"duro\", \"ébano\", \"ebrio\", \"echar\", \"eco\", \"ecuador\", \"edad\", \"edición\", \"edificio\", \"editor\", \"educar\", \"efecto\", \"eficaz\", \"eje\", \"ejemplo\", \"elefante\", \"elegir\", \"elemento\", \"elevar\", \"elipse\", \"élite\", \"elixir\", \"elogio\", \"eludir\", \"embudo\", \"emitir\", \"emoción\", \"empate\", \"empeño\", \"empleo\", \"empresa\", \"enano\", \"encargo\", \"enchufe\", \"encía\", \"enemigo\", \"enero\", \"enfado\", \"enfermo\", \"engaño\", \"enigma\", \"enlace\", \"enorme\", \"enredo\", \"ensayo\", \"enseñar\", \"entero\", \"entrar\", \"envase\", \"envío\", \"época\", \"equipo\", \"erizo\", \"escala\", \"escena\", \"escolar\", \"escribir\", \"escudo\", \"esencia\", \"esfera\", \"esfuerzo\", \"espada\", \"espejo\", \"espía\", \"esposa\", \"espuma\", \"esquí\", \"estar\", \"este\", \"estilo\", \"estufa\", \"etapa\", \"eterno\", \"ética\", \"etnia\", \"evadir\", \"evaluar\", \"evento\", \"evitar\", \"exacto\", \"examen\", \"exceso\", \"excusa\", \"exento\", \"exigir\", \"exilio\", \"existir\", \"éxito\", \"experto\", \"explicar\", \"exponer\", \"extremo\", \"fábrica\", \"fábula\", \"fachada\", \"fácil\", \"factor\", \"faena\", \"faja\", \"falda\", \"fallo\", \"falso\", \"faltar\", \"fama\", \"familia\", \"famoso\", \"faraón\", \"farmacia\", \"farol\", \"farsa\", \"fase\", \"fatiga\", \"fauna\", \"favor\", \"fax\", \"febrero\", \"fecha\", \"feliz\", \"feo\", \"feria\", \"feroz\", \"fértil\", \"fervor\", \"festín\", \"fiable\", \"fianza\", \"fiar\", \"fibra\", \"ficción\", \"ficha\", \"fideo\", \"fiebre\", \"fiel\", \"fiera\", \"fiesta\", \"figura\", \"fijar\", \"fijo\", \"fila\", \"filete\", \"filial\", \"filtro\", \"fin\", \"finca\", \"fingir\", \"finito\", \"firma\", \"flaco\", \"flauta\", \"flecha\", \"flor\", \"flota\", \"fluir\", \"flujo\", \"flúor\", \"fobia\", \"foca\", \"fogata\", \"fogón\", \"folio\", \"folleto\", \"fondo\", \"forma\", \"forro\", \"fortuna\", \"forzar\", \"fosa\", \"foto\", \"fracaso\", \"frágil\", \"franja\", \"frase\", \"fraude\", \"freír\", \"freno\", \"fresa\", \"frío\", \"frito\", \"fruta\", \"fuego\", \"fuente\", \"fuerza\", \"fuga\", \"fumar\", \"función\", \"funda\", \"furgón\", \"furia\", \"fusil\", \"fútbol\", \"futuro\", \"gacela\", \"gafas\", \"gaita\", \"gajo\", \"gala\", \"galería\", \"gallo\", \"gamba\", \"ganar\", \"gancho\", \"ganga\", \"ganso\", \"garaje\", \"garza\", \"gasolina\", \"gastar\", \"gato\", \"gavilán\", \"gemelo\", \"gemir\", \"gen\", \"género\", \"genio\", \"gente\", \"geranio\", \"gerente\", \"germen\", \"gesto\", \"gigante\", \"gimnasio\", \"girar\", \"giro\", \"glaciar\", \"globo\", \"gloria\", \"gol\", \"golfo\", \"goloso\", \"golpe\", \"goma\", \"gordo\", \"gorila\", \"gorra\", \"gota\", \"goteo\", \"gozar\", \"grada\", \"gráfico\", \"grano\", \"grasa\", \"gratis\", \"grave\", \"grieta\", \"grillo\", \"gripe\", \"gris\", \"grito\", \"grosor\", \"grúa\", \"grueso\", \"grumo\", \"grupo\", \"guante\", \"guapo\", \"guardia\", \"guerra\", \"guía\", \"guiño\", \"guion\", \"guiso\", \"guitarra\", \"gusano\", \"gustar\", \"haber\", \"hábil\", \"hablar\", \"hacer\", \"hacha\", \"hada\", \"hallar\", \"hamaca\", \"harina\", \"haz\", \"hazaña\", \"hebilla\", \"hebra\", \"hecho\", \"helado\", \"helio\", \"hembra\", \"herir\", \"hermano\", \"héroe\", \"hervir\", \"hielo\", \"hierro\", \"hígado\", \"higiene\", \"hijo\", \"himno\", \"historia\", \"hocico\", \"hogar\", \"hoguera\", \"hoja\", \"hombre\", \"hongo\", \"honor\", \"honra\", \"hora\", \"hormiga\", \"horno\", \"hostil\", \"hoyo\", \"hueco\", \"huelga\", \"huerta\", \"hueso\", \"huevo\", \"huida\", \"huir\", \"humano\", \"húmedo\", \"humilde\", \"humo\", \"hundir\", \"huracán\", \"hurto\", \"icono\", \"ideal\", \"idioma\", \"ídolo\", \"iglesia\", \"iglú\", \"igual\", \"ilegal\", \"ilusión\", \"imagen\", \"imán\", \"imitar\", \"impar\", \"imperio\", \"imponer\", \"impulso\", \"incapaz\", \"índice\", \"inerte\", \"infiel\", \"informe\", \"ingenio\", \"inicio\", \"inmenso\", \"inmune\", \"innato\", \"insecto\", \"instante\", \"interés\", \"íntimo\", \"intuir\", \"inútil\", \"invierno\", \"ira\", \"iris\", \"ironía\", \"isla\", \"islote\", \"jabalí\", \"jabón\", \"jamón\", \"jarabe\", \"jardín\", \"jarra\", \"jaula\", \"jazmín\", \"jefe\", \"jeringa\", \"jinete\", \"jornada\", \"joroba\", \"joven\", \"joya\", \"juerga\", \"jueves\", \"juez\", \"jugador\", \"jugo\", \"juguete\", \"juicio\", \"junco\", \"jungla\", \"junio\", \"juntar\", \"júpiter\", \"jurar\", \"justo\", \"juvenil\", \"juzgar\", \"kilo\", \"koala\", \"labio\", \"lacio\", \"lacra\", \"lado\", \"ladrón\", \"lagarto\", \"lágrima\", \"laguna\", \"laico\", \"lamer\", \"lámina\", \"lámpara\", \"lana\", \"lancha\", \"langosta\", \"lanza\", \"lápiz\", \"largo\", \"larva\", \"lástima\", \"lata\", \"látex\", \"latir\", \"laurel\", \"lavar\", \"lazo\", \"leal\", \"lección\", \"leche\", \"lector\", \"leer\", \"legión\", \"legumbre\", \"lejano\", \"lengua\", \"lento\", \"leña\", \"león\", \"leopardo\", \"lesión\", \"letal\", \"letra\", \"leve\", \"leyenda\", \"libertad\", \"libro\", \"licor\", \"líder\", \"lidiar\", \"lienzo\", \"liga\", \"ligero\", \"lima\", \"límite\", \"limón\", \"limpio\", \"lince\", \"lindo\", \"línea\", \"lingote\", \"lino\", \"linterna\", \"líquido\", \"liso\", \"lista\", \"litera\", \"litio\", \"litro\", \"llaga\", \"llama\", \"llanto\", \"llave\", \"llegar\", \"llenar\", \"llevar\", \"llorar\", \"llover\", \"lluvia\", \"lobo\", \"loción\", \"loco\", \"locura\", \"lógica\", \"logro\", \"lombriz\", \"lomo\", \"lonja\", \"lote\", \"lucha\", \"lucir\", \"lugar\", \"lujo\", \"luna\", \"lunes\", \"lupa\", \"lustro\", \"luto\", \"luz\", \"maceta\", \"macho\", \"madera\", \"madre\", \"maduro\", \"maestro\", \"mafia\", \"magia\", \"mago\", \"maíz\", \"maldad\", \"maleta\", \"malla\", \"malo\", \"mamá\", \"mambo\", \"mamut\", \"manco\", \"mando\", \"manejar\", \"manga\", \"maniquí\", \"manjar\", \"mano\", \"manso\", \"manta\", \"mañana\", \"mapa\", \"máquina\", \"mar\", \"marco\", \"marea\", \"marfil\", \"margen\", \"marido\", \"mármol\", \"marrón\", \"martes\", \"marzo\", \"masa\", \"máscara\", \"masivo\", \"matar\", \"materia\", \"matiz\", \"matriz\", \"máximo\", \"mayor\", \"mazorca\", \"mecha\", \"medalla\", \"medio\", \"médula\", \"mejilla\", \"mejor\", \"melena\", \"melón\", \"memoria\", \"menor\", \"mensaje\", \"mente\", \"menú\", \"mercado\", \"merengue\", \"mérito\", \"mes\", \"mesón\", \"meta\", \"meter\", \"método\", \"metro\", \"mezcla\", \"miedo\", \"miel\", \"miembro\", \"miga\", \"mil\", \"milagro\", \"militar\", \"millón\", \"mimo\", \"mina\", \"minero\", \"mínimo\", \"minuto\", \"miope\", \"mirar\", \"misa\", \"miseria\", \"misil\", \"mismo\", \"mitad\", \"mito\", \"mochila\", \"moción\", \"moda\", \"modelo\", \"moho\", \"mojar\", \"molde\", \"moler\", \"molino\", \"momento\", \"momia\", \"monarca\", \"moneda\", \"monja\", \"monto\", \"moño\", \"morada\", \"morder\", \"moreno\", \"morir\", \"morro\", \"morsa\", \"mortal\", \"mosca\", \"mostrar\", \"motivo\", \"mover\", \"móvil\", \"mozo\", \"mucho\", \"mudar\", \"mueble\", \"muela\", \"muerte\", \"muestra\", \"mugre\", \"mujer\", \"mula\", \"muleta\", \"multa\", \"mundo\", \"muñeca\", \"mural\", \"muro\", \"músculo\", \"museo\", \"musgo\", \"música\", \"muslo\", \"nácar\", \"nación\", \"nadar\", \"naipe\", \"naranja\", \"nariz\", \"narrar\", \"nasal\", \"natal\", \"nativo\", \"natural\", \"náusea\", \"naval\", \"nave\", \"navidad\", \"necio\", \"néctar\", \"negar\", \"negocio\", \"negro\", \"neón\", \"nervio\", \"neto\", \"neutro\", \"nevar\", \"nevera\", \"nicho\", \"nido\", \"niebla\", \"nieto\", \"niñez\", \"niño\", \"nítido\", \"nivel\", \"nobleza\", \"noche\", \"nómina\", \"noria\", \"norma\", \"norte\", \"nota\", \"noticia\", \"novato\", \"novela\", \"novio\", \"nube\", \"nuca\", \"núcleo\", \"nudillo\", \"nudo\", \"nuera\", \"nueve\", \"nuez\", \"nulo\", \"número\", \"nutria\", \"oasis\", \"obeso\", \"obispo\", \"objeto\", \"obra\", \"obrero\", \"observar\", \"obtener\", \"obvio\", \"oca\", \"ocaso\", \"océano\", \"ochenta\", \"ocho\", \"ocio\", \"ocre\", \"octavo\", \"octubre\", \"oculto\", \"ocupar\", \"ocurrir\", \"odiar\", \"odio\", \"odisea\", \"oeste\", \"ofensa\", \"oferta\", \"oficio\", \"ofrecer\", \"ogro\", \"oído\", \"oír\", \"ojo\", \"ola\", \"oleada\", \"olfato\", \"olivo\", \"olla\", \"olmo\", \"olor\", \"olvido\", \"ombligo\", \"onda\", \"onza\", \"opaco\", \"opción\", \"ópera\", \"opinar\", \"oponer\", \"optar\", \"óptica\", \"opuesto\", \"oración\", \"orador\", \"oral\", \"órbita\", \"orca\", \"orden\", \"oreja\", \"órgano\", \"orgía\", \"orgullo\", \"oriente\", \"origen\", \"orilla\", \"oro\", \"orquesta\", \"oruga\", \"osadía\", \"oscuro\", \"osezno\", \"oso\", \"ostra\", \"otoño\", \"otro\", \"oveja\", \"óvulo\", \"óxido\", \"oxígeno\", \"oyente\", \"ozono\", \"pacto\", \"padre\", \"paella\", \"página\", \"pago\", \"país\", \"pájaro\", \"palabra\", \"palco\", \"paleta\", \"pálido\", \"palma\", \"paloma\", \"palpar\", \"pan\", \"panal\", \"pánico\", \"pantera\", \"pañuelo\", \"papá\", \"papel\", \"papilla\", \"paquete\", \"parar\", \"parcela\", \"pared\", \"parir\", \"paro\", \"párpado\", \"parque\", \"párrafo\", \"parte\", \"pasar\", \"paseo\", \"pasión\", \"paso\", \"pasta\", \"pata\", \"patio\", \"patria\", \"pausa\", \"pauta\", \"pavo\", \"payaso\", \"peatón\", \"pecado\", \"pecera\", \"pecho\", \"pedal\", \"pedir\", \"pegar\", \"peine\", \"pelar\", \"peldaño\", \"pelea\", \"peligro\", \"pellejo\", \"pelo\", \"peluca\", \"pena\", \"pensar\", \"peñón\", \"peón\", \"peor\", \"pepino\", \"pequeño\", \"pera\", \"percha\", \"perder\", \"pereza\", \"perfil\", \"perico\", \"perla\", \"permiso\", \"perro\", \"persona\", \"pesa\", \"pesca\", \"pésimo\", \"pestaña\", \"pétalo\", \"petróleo\", \"pez\", \"pezuña\", \"picar\", \"pichón\", \"pie\", \"piedra\", \"pierna\", \"pieza\", \"pijama\", \"pilar\", \"piloto\", \"pimienta\", \"pino\", \"pintor\", \"pinza\", \"piña\", \"piojo\", \"pipa\", \"pirata\", \"pisar\", \"piscina\", \"piso\", \"pista\", \"pitón\", \"pizca\", \"placa\", \"plan\", \"plata\", \"playa\", \"plaza\", \"pleito\", \"pleno\", \"plomo\", \"pluma\", \"plural\", \"pobre\", \"poco\", \"poder\", \"podio\", \"poema\", \"poesía\", \"poeta\", \"polen\", \"policía\", \"pollo\", \"polvo\", \"pomada\", \"pomelo\", \"pomo\", \"pompa\", \"poner\", \"porción\", \"portal\", \"posada\", \"poseer\", \"posible\", \"poste\", \"potencia\", \"potro\", \"pozo\", \"prado\", \"precoz\", \"pregunta\", \"premio\", \"prensa\", \"preso\", \"previo\", \"primo\", \"príncipe\", \"prisión\", \"privar\", \"proa\", \"probar\", \"proceso\", \"producto\", \"proeza\", \"profesor\", \"programa\", \"prole\", \"promesa\", \"pronto\", \"propio\", \"próximo\", \"prueba\", \"público\", \"puchero\", \"pudor\", \"pueblo\", \"puerta\", \"puesto\", \"pulga\", \"pulir\", \"pulmón\", \"pulpo\", \"pulso\", \"puma\", \"punto\", \"puñal\", \"puño\", \"pupa\", \"pupila\", \"puré\", \"quedar\", \"queja\", \"quemar\", \"querer\", \"queso\", \"quieto\", \"química\", \"quince\", \"quitar\", \"rábano\", \"rabia\", \"rabo\", \"ración\", \"radical\", \"raíz\", \"rama\", \"rampa\", \"rancho\", \"rango\", \"rapaz\", \"rápido\", \"rapto\", \"rasgo\", \"raspa\", \"rato\", \"rayo\", \"raza\", \"razón\", \"reacción\", \"realidad\", \"rebaño\", \"rebote\", \"recaer\", \"receta\", \"rechazo\", \"recoger\", \"recreo\", \"recto\", \"recurso\", \"red\", \"redondo\", \"reducir\", \"reflejo\", \"reforma\", \"refrán\", \"refugio\", \"regalo\", \"regir\", \"regla\", \"regreso\", \"rehén\", \"reino\", \"reír\", \"reja\", \"relato\", \"relevo\", \"relieve\", \"relleno\", \"reloj\", \"remar\", \"remedio\", \"remo\", \"rencor\", \"rendir\", \"renta\", \"reparto\", \"repetir\", \"reposo\", \"reptil\", \"res\", \"rescate\", \"resina\", \"respeto\", \"resto\", \"resumen\", \"retiro\", \"retorno\", \"retrato\", \"reunir\", \"revés\", \"revista\", \"rey\", \"rezar\", \"rico\", \"riego\", \"rienda\", \"riesgo\", \"rifa\", \"rígido\", \"rigor\", \"rincón\", \"riñón\", \"río\", \"riqueza\", \"risa\", \"ritmo\", \"rito\", \"rizo\", \"roble\", \"roce\", \"rociar\", \"rodar\", \"rodeo\", \"rodilla\", \"roer\", \"rojizo\", \"rojo\", \"romero\", \"romper\", \"ron\", \"ronco\", \"ronda\", \"ropa\", \"ropero\", \"rosa\", \"rosca\", \"rostro\", \"rotar\", \"rubí\", \"rubor\", \"rudo\", \"rueda\", \"rugir\", \"ruido\", \"ruina\", \"ruleta\", \"rulo\", \"rumbo\", \"rumor\", \"ruptura\", \"ruta\", \"rutina\", \"sábado\", \"saber\", \"sabio\", \"sable\", \"sacar\", \"sagaz\", \"sagrado\", \"sala\", \"saldo\", \"salero\", \"salir\", \"salmón\", \"salón\", \"salsa\", \"salto\", \"salud\", \"salvar\", \"samba\", \"sanción\", \"sandía\", \"sanear\", \"sangre\", \"sanidad\", \"sano\", \"santo\", \"sapo\", \"saque\", \"sardina\", \"sartén\", \"sastre\", \"satán\", \"sauna\", \"saxofón\", \"sección\", \"seco\", \"secreto\", \"secta\", \"sed\", \"seguir\", \"seis\", \"sello\", \"selva\", \"semana\", \"semilla\", \"senda\", \"sensor\", \"señal\", \"señor\", \"separar\", \"sepia\", \"sequía\", \"ser\", \"serie\", \"sermón\", \"servir\", \"sesenta\", \"sesión\", \"seta\", \"setenta\", \"severo\", \"sexo\", \"sexto\", \"sidra\", \"siesta\", \"siete\", \"siglo\", \"signo\", \"sílaba\", \"silbar\", \"silencio\", \"silla\", \"símbolo\", \"simio\", \"sirena\", \"sistema\", \"sitio\", \"situar\", \"sobre\", \"socio\", \"sodio\", \"sol\", \"solapa\", \"soldado\", \"soledad\", \"sólido\", \"soltar\", \"solución\", \"sombra\", \"sondeo\", \"sonido\", \"sonoro\", \"sonrisa\", \"sopa\", \"soplar\", \"soporte\", \"sordo\", \"sorpresa\", \"sorteo\", \"sostén\", \"sótano\", \"suave\", \"subir\", \"suceso\", \"sudor\", \"suegra\", \"suelo\", \"sueño\", \"suerte\", \"sufrir\", \"sujeto\", \"sultán\", \"sumar\", \"superar\", \"suplir\", \"suponer\", \"supremo\", \"sur\", \"surco\", \"sureño\", \"surgir\", \"susto\", \"sutil\", \"tabaco\", \"tabique\", \"tabla\", \"tabú\", \"taco\", \"tacto\", \"tajo\", \"talar\", \"talco\", \"talento\", \"talla\", \"talón\", \"tamaño\", \"tambor\", \"tango\", \"tanque\", \"tapa\", \"tapete\", \"tapia\", \"tapón\", \"taquilla\", \"tarde\", \"tarea\", \"tarifa\", \"tarjeta\", \"tarot\", \"tarro\", \"tarta\", \"tatuaje\", \"tauro\", \"taza\", \"tazón\", \"teatro\", \"techo\", \"tecla\", \"técnica\", \"tejado\", \"tejer\", \"tejido\", \"tela\", \"teléfono\", \"tema\", \"temor\", \"templo\", \"tenaz\", \"tender\", \"tener\", \"tenis\", \"tenso\", \"teoría\", \"terapia\", \"terco\", \"término\", \"ternura\", \"terror\", \"tesis\", \"tesoro\", \"testigo\", \"tetera\", \"texto\", \"tez\", \"tibio\", \"tiburón\", \"tiempo\", \"tienda\", \"tierra\", \"tieso\", \"tigre\", \"tijera\", \"tilde\", \"timbre\", \"tímido\", \"timo\", \"tinta\", \"tío\", \"típico\", \"tipo\", \"tira\", \"tirón\", \"titán\", \"títere\", \"título\", \"tiza\", \"toalla\", \"tobillo\", \"tocar\", \"tocino\", \"todo\", \"toga\", \"toldo\", \"tomar\", \"tono\", \"tonto\", \"topar\", \"tope\", \"toque\", \"tórax\", \"torero\", \"tormenta\", \"torneo\", \"toro\", \"torpedo\", \"torre\", \"torso\", \"tortuga\", \"tos\", \"tosco\", \"toser\", \"tóxico\", \"trabajo\", \"tractor\", \"traer\", \"tráfico\", \"trago\", \"traje\", \"tramo\", \"trance\", \"trato\", \"trauma\", \"trazar\", \"trébol\", \"tregua\", \"treinta\", \"tren\", \"trepar\", \"tres\", \"tribu\", \"trigo\", \"tripa\", \"triste\", \"triunfo\", \"trofeo\", \"trompa\", \"tronco\", \"tropa\", \"trote\", \"trozo\", \"truco\", \"trueno\", \"trufa\", \"tubería\", \"tubo\", \"tuerto\", \"tumba\", \"tumor\", \"túnel\", \"túnica\", \"turbina\", \"turismo\", \"turno\", \"tutor\", \"ubicar\", \"úlcera\", \"umbral\", \"unidad\", \"unir\", \"universo\", \"uno\", \"untar\", \"uña\", \"urbano\", \"urbe\", \"urgente\", \"urna\", \"usar\", \"usuario\", \"útil\", \"utopía\", \"uva\", \"vaca\", \"vacío\", \"vacuna\", \"vagar\", \"vago\", \"vaina\", \"vajilla\", \"vale\", \"válido\", \"valle\", \"valor\", \"válvula\", \"vampiro\", \"vara\", \"variar\", \"varón\", \"vaso\", \"vecino\", \"vector\", \"vehículo\", \"veinte\", \"vejez\", \"vela\", \"velero\", \"veloz\", \"vena\", \"vencer\", \"venda\", \"veneno\", \"vengar\", \"venir\", \"venta\", \"venus\", \"ver\", \"verano\", \"verbo\", \"verde\", \"vereda\", \"verja\", \"verso\", \"verter\", \"vía\", \"viaje\", \"vibrar\", \"vicio\", \"víctima\", \"vida\", \"vídeo\", \"vidrio\", \"viejo\", \"viernes\", \"vigor\", \"vil\", \"villa\", \"vinagre\", \"vino\", \"viñedo\", \"violín\", \"viral\", \"virgo\", \"virtud\", \"visor\", \"víspera\", \"vista\", \"vitamina\", \"viudo\", \"vivaz\", \"vivero\", \"vivir\", \"vivo\", \"volcán\", \"volumen\", \"volver\", \"voraz\", \"votar\", \"voto\", \"voz\", \"vuelo\", \"vulgar\", \"yacer\", \"yate\", \"yegua\", \"yema\", \"yerno\", \"yeso\", \"yodo\", \"yoga\", \"yogur\", \"zafiro\", \"zanja\", \"zapato\", \"zarza\", \"zona\", \"zorro\", \"zumo\", \"zurdo\"]\n    static var simplifiedChineseWords: [String] = [\"的\", \"一\", \"是\", \"在\", \"不\", \"了\", \"有\", \"和\", \"人\", \"这\", \"中\", \"大\", \"为\", \"上\", \"个\", \"国\", \"我\", \"以\", \"要\", \"他\", \"时\", \"来\", \"用\", \"们\", \"生\", \"到\", \"作\", \"地\", \"于\", \"出\", \"就\", \"分\", \"对\", \"成\", \"会\", \"可\", \"主\", \"发\", \"年\", \"动\", \"同\", \"工\", \"也\", \"能\", \"下\", \"过\", \"子\", \"说\", \"产\", \"种\", \"面\", \"而\", \"方\", \"后\", \"多\", \"定\", \"行\", \"学\", \"法\", \"所\", \"民\", \"得\", \"经\", \"十\", \"三\", \"之\", \"进\", \"着\", \"等\", \"部\", \"度\", \"家\", \"电\", \"力\", \"里\", \"如\", \"水\", \"化\", \"高\", \"自\", \"二\", \"理\", \"起\", \"小\", \"物\", \"现\", \"实\", \"加\", \"量\", \"都\", \"两\", \"体\", \"制\", \"机\", \"当\", \"使\", \"点\", \"从\", \"业\", \"本\", \"去\", \"把\", \"性\", \"好\", \"应\", \"开\", \"它\", \"合\", \"还\", \"因\", \"由\", \"其\", \"些\", \"然\", \"前\", \"外\", \"天\", \"政\", \"四\", \"日\", \"那\", \"社\", \"义\", \"事\", \"平\", \"形\", \"相\", \"全\", \"表\", \"间\", \"样\", \"与\", \"关\", \"各\", \"重\", \"新\", \"线\", \"内\", \"数\", \"正\", \"心\", \"反\", \"你\", \"明\", \"看\", \"原\", \"又\", \"么\", \"利\", \"比\", \"或\", \"但\", \"质\", \"气\", \"第\", \"向\", \"道\", \"命\", \"此\", \"变\", \"条\", \"只\", \"没\", \"结\", \"解\", \"问\", \"意\", \"建\", \"月\", \"公\", \"无\", \"系\", \"军\", \"很\", \"情\", \"者\", \"最\", \"立\", \"代\", \"想\", \"已\", \"通\", \"并\", \"提\", \"直\", \"题\", \"党\", \"程\", \"展\", \"五\", \"果\", \"料\", \"象\", \"员\", \"革\", \"位\", \"入\", \"常\", \"文\", \"总\", \"次\", \"品\", \"式\", \"活\", \"设\", \"及\", \"管\", \"特\", \"件\", \"长\", \"求\", \"老\", \"头\", \"基\", \"资\", \"边\", \"流\", \"路\", \"级\", \"少\", \"图\", \"山\", \"统\", \"接\", \"知\", \"较\", \"将\", \"组\", \"见\", \"计\", \"别\", \"她\", \"手\", \"角\", \"期\", \"根\", \"论\", \"运\", \"农\", \"指\", \"几\", \"九\", \"区\", \"强\", \"放\", \"决\", \"西\", \"被\", \"干\", \"做\", \"必\", \"战\", \"先\", \"回\", \"则\", \"任\", \"取\", \"据\", \"处\", \"队\", \"南\", \"给\", \"色\", \"光\", \"门\", \"即\", \"保\", \"治\", \"北\", \"造\", \"百\", \"规\", \"热\", \"领\", \"七\", \"海\", \"口\", \"东\", \"导\", \"器\", \"压\", \"志\", \"世\", \"金\", \"增\", \"争\", \"济\", \"阶\", \"油\", \"思\", \"术\", \"极\", \"交\", \"受\", \"联\", \"什\", \"认\", \"六\", \"共\", \"权\", \"收\", \"证\", \"改\", \"清\", \"美\", \"再\", \"采\", \"转\", \"更\", \"单\", \"风\", \"切\", \"打\", \"白\", \"教\", \"速\", \"花\", \"带\", \"安\", \"场\", \"身\", \"车\", \"例\", \"真\", \"务\", \"具\", \"万\", \"每\", \"目\", \"至\", \"达\", \"走\", \"积\", \"示\", \"议\", \"声\", \"报\", \"斗\", \"完\", \"类\", \"八\", \"离\", \"华\", \"名\", \"确\", \"才\", \"科\", \"张\", \"信\", \"马\", \"节\", \"话\", \"米\", \"整\", \"空\", \"元\", \"况\", \"今\", \"集\", \"温\", \"传\", \"土\", \"许\", \"步\", \"群\", \"广\", \"石\", \"记\", \"需\", \"段\", \"研\", \"界\", \"拉\", \"林\", \"律\", \"叫\", \"且\", \"究\", \"观\", \"越\", \"织\", \"装\", \"影\", \"算\", \"低\", \"持\", \"音\", \"众\", \"书\", \"布\", \"复\", \"容\", \"儿\", \"须\", \"际\", \"商\", \"非\", \"验\", \"连\", \"断\", \"深\", \"难\", \"近\", \"矿\", \"千\", \"周\", \"委\", \"素\", \"技\", \"备\", \"半\", \"办\", \"青\", \"省\", \"列\", \"习\", \"响\", \"约\", \"支\", \"般\", \"史\", \"感\", \"劳\", \"便\", \"团\", \"往\", \"酸\", \"历\", \"市\", \"克\", \"何\", \"除\", \"消\", \"构\", \"府\", \"称\", \"太\", \"准\", \"精\", \"值\", \"号\", \"率\", \"族\", \"维\", \"划\", \"选\", \"标\", \"写\", \"存\", \"候\", \"毛\", \"亲\", \"快\", \"效\", \"斯\", \"院\", \"查\", \"江\", \"型\", \"眼\", \"王\", \"按\", \"格\", \"养\", \"易\", \"置\", \"派\", \"层\", \"片\", \"始\", \"却\", \"专\", \"状\", \"育\", \"厂\", \"京\", \"识\", \"适\", \"属\", \"圆\", \"包\", \"火\", \"住\", \"调\", \"满\", \"县\", \"局\", \"照\", \"参\", \"红\", \"细\", \"引\", \"听\", \"该\", \"铁\", \"价\", \"严\", \"首\", \"底\", \"液\", \"官\", \"德\", \"随\", \"病\", \"苏\", \"失\", \"尔\", \"死\", \"讲\", \"配\", \"女\", \"黄\", \"推\", \"显\", \"谈\", \"罪\", \"神\", \"艺\", \"呢\", \"席\", \"含\", \"企\", \"望\", \"密\", \"批\", \"营\", \"项\", \"防\", \"举\", \"球\", \"英\", \"氧\", \"势\", \"告\", \"李\", \"台\", \"落\", \"木\", \"帮\", \"轮\", \"破\", \"亚\", \"师\", \"围\", \"注\", \"远\", \"字\", \"材\", \"排\", \"供\", \"河\", \"态\", \"封\", \"另\", \"施\", \"减\", \"树\", \"溶\", \"怎\", \"止\", \"案\", \"言\", \"士\", \"均\", \"武\", \"固\", \"叶\", \"鱼\", \"波\", \"视\", \"仅\", \"费\", \"紧\", \"爱\", \"左\", \"章\", \"早\", \"朝\", \"害\", \"续\", \"轻\", \"服\", \"试\", \"食\", \"充\", \"兵\", \"源\", \"判\", \"护\", \"司\", \"足\", \"某\", \"练\", \"差\", \"致\", \"板\", \"田\", \"降\", \"黑\", \"犯\", \"负\", \"击\", \"范\", \"继\", \"兴\", \"似\", \"余\", \"坚\", \"曲\", \"输\", \"修\", \"故\", \"城\", \"夫\", \"够\", \"送\", \"笔\", \"船\", \"占\", \"右\", \"财\", \"吃\", \"富\", \"春\", \"职\", \"觉\", \"汉\", \"画\", \"功\", \"巴\", \"跟\", \"虽\", \"杂\", \"飞\", \"检\", \"吸\", \"助\", \"升\", \"阳\", \"互\", \"初\", \"创\", \"抗\", \"考\", \"投\", \"坏\", \"策\", \"古\", \"径\", \"换\", \"未\", \"跑\", \"留\", \"钢\", \"曾\", \"端\", \"责\", \"站\", \"简\", \"述\", \"钱\", \"副\", \"尽\", \"帝\", \"射\", \"草\", \"冲\", \"承\", \"独\", \"令\", \"限\", \"阿\", \"宣\", \"环\", \"双\", \"请\", \"超\", \"微\", \"让\", \"控\", \"州\", \"良\", \"轴\", \"找\", \"否\", \"纪\", \"益\", \"依\", \"优\", \"顶\", \"础\", \"载\", \"倒\", \"房\", \"突\", \"坐\", \"粉\", \"敌\", \"略\", \"客\", \"袁\", \"冷\", \"胜\", \"绝\", \"析\", \"块\", \"剂\", \"测\", \"丝\", \"协\", \"诉\", \"念\", \"陈\", \"仍\", \"罗\", \"盐\", \"友\", \"洋\", \"错\", \"苦\", \"夜\", \"刑\", \"移\", \"频\", \"逐\", \"靠\", \"混\", \"母\", \"短\", \"皮\", \"终\", \"聚\", \"汽\", \"村\", \"云\", \"哪\", \"既\", \"距\", \"卫\", \"停\", \"烈\", \"央\", \"察\", \"烧\", \"迅\", \"境\", \"若\", \"印\", \"洲\", \"刻\", \"括\", \"激\", \"孔\", \"搞\", \"甚\", \"室\", \"待\", \"核\", \"校\", \"散\", \"侵\", \"吧\", \"甲\", \"游\", \"久\", \"菜\", \"味\", \"旧\", \"模\", \"湖\", \"货\", \"损\", \"预\", \"阻\", \"毫\", \"普\", \"稳\", \"乙\", \"妈\", \"植\", \"息\", \"扩\", \"银\", \"语\", \"挥\", \"酒\", \"守\", \"拿\", \"序\", \"纸\", \"医\", \"缺\", \"雨\", \"吗\", \"针\", \"刘\", \"啊\", \"急\", \"唱\", \"误\", \"训\", \"愿\", \"审\", \"附\", \"获\", \"茶\", \"鲜\", \"粮\", \"斤\", \"孩\", \"脱\", \"硫\", \"肥\", \"善\", \"龙\", \"演\", \"父\", \"渐\", \"血\", \"欢\", \"械\", \"掌\", \"歌\", \"沙\", \"刚\", \"攻\", \"谓\", \"盾\", \"讨\", \"晚\", \"粒\", \"乱\", \"燃\", \"矛\", \"乎\", \"杀\", \"药\", \"宁\", \"鲁\", \"贵\", \"钟\", \"煤\", \"读\", \"班\", \"伯\", \"香\", \"介\", \"迫\", \"句\", \"丰\", \"培\", \"握\", \"兰\", \"担\", \"弦\", \"蛋\", \"沉\", \"假\", \"穿\", \"执\", \"答\", \"乐\", \"谁\", \"顺\", \"烟\", \"缩\", \"征\", \"脸\", \"喜\", \"松\", \"脚\", \"困\", \"异\", \"免\", \"背\", \"星\", \"福\", \"买\", \"染\", \"井\", \"概\", \"慢\", \"怕\", \"磁\", \"倍\", \"祖\", \"皇\", \"促\", \"静\", \"补\", \"评\", \"翻\", \"肉\", \"践\", \"尼\", \"衣\", \"宽\", \"扬\", \"棉\", \"希\", \"伤\", \"操\", \"垂\", \"秋\", \"宜\", \"氢\", \"套\", \"督\", \"振\", \"架\", \"亮\", \"末\", \"宪\", \"庆\", \"编\", \"牛\", \"触\", \"映\", \"雷\", \"销\", \"诗\", \"座\", \"居\", \"抓\", \"裂\", \"胞\", \"呼\", \"娘\", \"景\", \"威\", \"绿\", \"晶\", \"厚\", \"盟\", \"衡\", \"鸡\", \"孙\", \"延\", \"危\", \"胶\", \"屋\", \"乡\", \"临\", \"陆\", \"顾\", \"掉\", \"呀\", \"灯\", \"岁\", \"措\", \"束\", \"耐\", \"剧\", \"玉\", \"赵\", \"跳\", \"哥\", \"季\", \"课\", \"凯\", \"胡\", \"额\", \"款\", \"绍\", \"卷\", \"齐\", \"伟\", \"蒸\", \"殖\", \"永\", \"宗\", \"苗\", \"川\", \"炉\", \"岩\", \"弱\", \"零\", \"杨\", \"奏\", \"沿\", \"露\", \"杆\", \"探\", \"滑\", \"镇\", \"饭\", \"浓\", \"航\", \"怀\", \"赶\", \"库\", \"夺\", \"伊\", \"灵\", \"税\", \"途\", \"灭\", \"赛\", \"归\", \"召\", \"鼓\", \"播\", \"盘\", \"裁\", \"险\", \"康\", \"唯\", \"录\", \"菌\", \"纯\", \"借\", \"糖\", \"盖\", \"横\", \"符\", \"私\", \"努\", \"堂\", \"域\", \"枪\", \"润\", \"幅\", \"哈\", \"竟\", \"熟\", \"虫\", \"泽\", \"脑\", \"壤\", \"碳\", \"欧\", \"遍\", \"侧\", \"寨\", \"敢\", \"彻\", \"虑\", \"斜\", \"薄\", \"庭\", \"纳\", \"弹\", \"饲\", \"伸\", \"折\", \"麦\", \"湿\", \"暗\", \"荷\", \"瓦\", \"塞\", \"床\", \"筑\", \"恶\", \"户\", \"访\", \"塔\", \"奇\", \"透\", \"梁\", \"刀\", \"旋\", \"迹\", \"卡\", \"氯\", \"遇\", \"份\", \"毒\", \"泥\", \"退\", \"洗\", \"摆\", \"灰\", \"彩\", \"卖\", \"耗\", \"夏\", \"择\", \"忙\", \"铜\", \"献\", \"硬\", \"予\", \"繁\", \"圈\", \"雪\", \"函\", \"亦\", \"抽\", \"篇\", \"阵\", \"阴\", \"丁\", \"尺\", \"追\", \"堆\", \"雄\", \"迎\", \"泛\", \"爸\", \"楼\", \"避\", \"谋\", \"吨\", \"野\", \"猪\", \"旗\", \"累\", \"偏\", \"典\", \"馆\", \"索\", \"秦\", \"脂\", \"潮\", \"爷\", \"豆\", \"忽\", \"托\", \"惊\", \"塑\", \"遗\", \"愈\", \"朱\", \"替\", \"纤\", \"粗\", \"倾\", \"尚\", \"痛\", \"楚\", \"谢\", \"奋\", \"购\", \"磨\", \"君\", \"池\", \"旁\", \"碎\", \"骨\", \"监\", \"捕\", \"弟\", \"暴\", \"割\", \"贯\", \"殊\", \"释\", \"词\", \"亡\", \"壁\", \"顿\", \"宝\", \"午\", \"尘\", \"闻\", \"揭\", \"炮\", \"残\", \"冬\", \"桥\", \"妇\", \"警\", \"综\", \"招\", \"吴\", \"付\", \"浮\", \"遭\", \"徐\", \"您\", \"摇\", \"谷\", \"赞\", \"箱\", \"隔\", \"订\", \"男\", \"吹\", \"园\", \"纷\", \"唐\", \"败\", \"宋\", \"玻\", \"巨\", \"耕\", \"坦\", \"荣\", \"闭\", \"湾\", \"键\", \"凡\", \"驻\", \"锅\", \"救\", \"恩\", \"剥\", \"凝\", \"碱\", \"齿\", \"截\", \"炼\", \"麻\", \"纺\", \"禁\", \"废\", \"盛\", \"版\", \"缓\", \"净\", \"睛\", \"昌\", \"婚\", \"涉\", \"筒\", \"嘴\", \"插\", \"岸\", \"朗\", \"庄\", \"街\", \"藏\", \"姑\", \"贸\", \"腐\", \"奴\", \"啦\", \"惯\", \"乘\", \"伙\", \"恢\", \"匀\", \"纱\", \"扎\", \"辩\", \"耳\", \"彪\", \"臣\", \"亿\", \"璃\", \"抵\", \"脉\", \"秀\", \"萨\", \"俄\", \"网\", \"舞\", \"店\", \"喷\", \"纵\", \"寸\", \"汗\", \"挂\", \"洪\", \"贺\", \"闪\", \"柬\", \"爆\", \"烯\", \"津\", \"稻\", \"墙\", \"软\", \"勇\", \"像\", \"滚\", \"厘\", \"蒙\", \"芳\", \"肯\", \"坡\", \"柱\", \"荡\", \"腿\", \"仪\", \"旅\", \"尾\", \"轧\", \"冰\", \"贡\", \"登\", \"黎\", \"削\", \"钻\", \"勒\", \"逃\", \"障\", \"氨\", \"郭\", \"峰\", \"币\", \"港\", \"伏\", \"轨\", \"亩\", \"毕\", \"擦\", \"莫\", \"刺\", \"浪\", \"秘\", \"援\", \"株\", \"健\", \"售\", \"股\", \"岛\", \"甘\", \"泡\", \"睡\", \"童\", \"铸\", \"汤\", \"阀\", \"休\", \"汇\", \"舍\", \"牧\", \"绕\", \"炸\", \"哲\", \"磷\", \"绩\", \"朋\", \"淡\", \"尖\", \"启\", \"陷\", \"柴\", \"呈\", \"徒\", \"颜\", \"泪\", \"稍\", \"忘\", \"泵\", \"蓝\", \"拖\", \"洞\", \"授\", \"镜\", \"辛\", \"壮\", \"锋\", \"贫\", \"虚\", \"弯\", \"摩\", \"泰\", \"幼\", \"廷\", \"尊\", \"窗\", \"纲\", \"弄\", \"隶\", \"疑\", \"氏\", \"宫\", \"姐\", \"震\", \"瑞\", \"怪\", \"尤\", \"琴\", \"循\", \"描\", \"膜\", \"违\", \"夹\", \"腰\", \"缘\", \"珠\", \"穷\", \"森\", \"枝\", \"竹\", \"沟\", \"催\", \"绳\", \"忆\", \"邦\", \"剩\", \"幸\", \"浆\", \"栏\", \"拥\", \"牙\", \"贮\", \"礼\", \"滤\", \"钠\", \"纹\", \"罢\", \"拍\", \"咱\", \"喊\", \"袖\", \"埃\", \"勤\", \"罚\", \"焦\", \"潜\", \"伍\", \"墨\", \"欲\", \"缝\", \"姓\", \"刊\", \"饱\", \"仿\", \"奖\", \"铝\", \"鬼\", \"丽\", \"跨\", \"默\", \"挖\", \"链\", \"扫\", \"喝\", \"袋\", \"炭\", \"污\", \"幕\", \"诸\", \"弧\", \"励\", \"梅\", \"奶\", \"洁\", \"灾\", \"舟\", \"鉴\", \"苯\", \"讼\", \"抱\", \"毁\", \"懂\", \"寒\", \"智\", \"埔\", \"寄\", \"届\", \"跃\", \"渡\", \"挑\", \"丹\", \"艰\", \"贝\", \"碰\", \"拔\", \"爹\", \"戴\", \"码\", \"梦\", \"芽\", \"熔\", \"赤\", \"渔\", \"哭\", \"敬\", \"颗\", \"奔\", \"铅\", \"仲\", \"虎\", \"稀\", \"妹\", \"乏\", \"珍\", \"申\", \"桌\", \"遵\", \"允\", \"隆\", \"螺\", \"仓\", \"魏\", \"锐\", \"晓\", \"氮\", \"兼\", \"隐\", \"碍\", \"赫\", \"拨\", \"忠\", \"肃\", \"缸\", \"牵\", \"抢\", \"博\", \"巧\", \"壳\", \"兄\", \"杜\", \"讯\", \"诚\", \"碧\", \"祥\", \"柯\", \"页\", \"巡\", \"矩\", \"悲\", \"灌\", \"龄\", \"伦\", \"票\", \"寻\", \"桂\", \"铺\", \"圣\", \"恐\", \"恰\", \"郑\", \"趣\", \"抬\", \"荒\", \"腾\", \"贴\", \"柔\", \"滴\", \"猛\", \"阔\", \"辆\", \"妻\", \"填\", \"撤\", \"储\", \"签\", \"闹\", \"扰\", \"紫\", \"砂\", \"递\", \"戏\", \"吊\", \"陶\", \"伐\", \"喂\", \"疗\", \"瓶\", \"婆\", \"抚\", \"臂\", \"摸\", \"忍\", \"虾\", \"蜡\", \"邻\", \"胸\", \"巩\", \"挤\", \"偶\", \"弃\", \"槽\", \"劲\", \"乳\", \"邓\", \"吉\", \"仁\", \"烂\", \"砖\", \"租\", \"乌\", \"舰\", \"伴\", \"瓜\", \"浅\", \"丙\", \"暂\", \"燥\", \"橡\", \"柳\", \"迷\", \"暖\", \"牌\", \"秧\", \"胆\", \"详\", \"簧\", \"踏\", \"瓷\", \"谱\", \"呆\", \"宾\", \"糊\", \"洛\", \"辉\", \"愤\", \"竞\", \"隙\", \"怒\", \"粘\", \"乃\", \"绪\", \"肩\", \"籍\", \"敏\", \"涂\", \"熙\", \"皆\", \"侦\", \"悬\", \"掘\", \"享\", \"纠\", \"醒\", \"狂\", \"锁\", \"淀\", \"恨\", \"牲\", \"霸\", \"爬\", \"赏\", \"逆\", \"玩\", \"陵\", \"祝\", \"秒\", \"浙\", \"貌\", \"役\", \"彼\", \"悉\", \"鸭\", \"趋\", \"凤\", \"晨\", \"畜\", \"辈\", \"秩\", \"卵\", \"署\", \"梯\", \"炎\", \"滩\", \"棋\", \"驱\", \"筛\", \"峡\", \"冒\", \"啥\", \"寿\", \"译\", \"浸\", \"泉\", \"帽\", \"迟\", \"硅\", \"疆\", \"贷\", \"漏\", \"稿\", \"冠\", \"嫩\", \"胁\", \"芯\", \"牢\", \"叛\", \"蚀\", \"奥\", \"鸣\", \"岭\", \"羊\", \"凭\", \"串\", \"塘\", \"绘\", \"酵\", \"融\", \"盆\", \"锡\", \"庙\", \"筹\", \"冻\", \"辅\", \"摄\", \"袭\", \"筋\", \"拒\", \"僚\", \"旱\", \"钾\", \"鸟\", \"漆\", \"沈\", \"眉\", \"疏\", \"添\", \"棒\", \"穗\", \"硝\", \"韩\", \"逼\", \"扭\", \"侨\", \"凉\", \"挺\", \"碗\", \"栽\", \"炒\", \"杯\", \"患\", \"馏\", \"劝\", \"豪\", \"辽\", \"勃\", \"鸿\", \"旦\", \"吏\", \"拜\", \"狗\", \"埋\", \"辊\", \"掩\", \"饮\", \"搬\", \"骂\", \"辞\", \"勾\", \"扣\", \"估\", \"蒋\", \"绒\", \"雾\", \"丈\", \"朵\", \"姆\", \"拟\", \"宇\", \"辑\", \"陕\", \"雕\", \"偿\", \"蓄\", \"崇\", \"剪\", \"倡\", \"厅\", \"咬\", \"驶\", \"薯\", \"刷\", \"斥\", \"番\", \"赋\", \"奉\", \"佛\", \"浇\", \"漫\", \"曼\", \"扇\", \"钙\", \"桃\", \"扶\", \"仔\", \"返\", \"俗\", \"亏\", \"腔\", \"鞋\", \"棱\", \"覆\", \"框\", \"悄\", \"叔\", \"撞\", \"骗\", \"勘\", \"旺\", \"沸\", \"孤\", \"吐\", \"孟\", \"渠\", \"屈\", \"疾\", \"妙\", \"惜\", \"仰\", \"狠\", \"胀\", \"谐\", \"抛\", \"霉\", \"桑\", \"岗\", \"嘛\", \"衰\", \"盗\", \"渗\", \"脏\", \"赖\", \"涌\", \"甜\", \"曹\", \"阅\", \"肌\", \"哩\", \"厉\", \"烃\", \"纬\", \"毅\", \"昨\", \"伪\", \"症\", \"煮\", \"叹\", \"钉\", \"搭\", \"茎\", \"笼\", \"酷\", \"偷\", \"弓\", \"锥\", \"恒\", \"杰\", \"坑\", \"鼻\", \"翼\", \"纶\", \"叙\", \"狱\", \"逮\", \"罐\", \"络\", \"棚\", \"抑\", \"膨\", \"蔬\", \"寺\", \"骤\", \"穆\", \"冶\", \"枯\", \"册\", \"尸\", \"凸\", \"绅\", \"坯\", \"牺\", \"焰\", \"轰\", \"欣\", \"晋\", \"瘦\", \"御\", \"锭\", \"锦\", \"丧\", \"旬\", \"锻\", \"垄\", \"搜\", \"扑\", \"邀\", \"亭\", \"酯\", \"迈\", \"舒\", \"脆\", \"酶\", \"闲\", \"忧\", \"酚\", \"顽\", \"羽\", \"涨\", \"卸\", \"仗\", \"陪\", \"辟\", \"惩\", \"杭\", \"姚\", \"肚\", \"捉\", \"飘\", \"漂\", \"昆\", \"欺\", \"吾\", \"郎\", \"烷\", \"汁\", \"呵\", \"饰\", \"萧\", \"雅\", \"邮\", \"迁\", \"燕\", \"撒\", \"姻\", \"赴\", \"宴\", \"烦\", \"债\", \"帐\", \"斑\", \"铃\", \"旨\", \"醇\", \"董\", \"饼\", \"雏\", \"姿\", \"拌\", \"傅\", \"腹\", \"妥\", \"揉\", \"贤\", \"拆\", \"歪\", \"葡\", \"胺\", \"丢\", \"浩\", \"徽\", \"昂\", \"垫\", \"挡\", \"览\", \"贪\", \"慰\", \"缴\", \"汪\", \"慌\", \"冯\", \"诺\", \"姜\", \"谊\", \"凶\", \"劣\", \"诬\", \"耀\", \"昏\", \"躺\", \"盈\", \"骑\", \"乔\", \"溪\", \"丛\", \"卢\", \"抹\", \"闷\", \"咨\", \"刮\", \"驾\", \"缆\", \"悟\", \"摘\", \"铒\", \"掷\", \"颇\", \"幻\", \"柄\", \"惠\", \"惨\", \"佳\", \"仇\", \"腊\", \"窝\", \"涤\", \"剑\", \"瞧\", \"堡\", \"泼\", \"葱\", \"罩\", \"霍\", \"捞\", \"胎\", \"苍\", \"滨\", \"俩\", \"捅\", \"湘\", \"砍\", \"霞\", \"邵\", \"萄\", \"疯\", \"淮\", \"遂\", \"熊\", \"粪\", \"烘\", \"宿\", \"档\", \"戈\", \"驳\", \"嫂\", \"裕\", \"徙\", \"箭\", \"捐\", \"肠\", \"撑\", \"晒\", \"辨\", \"殿\", \"莲\", \"摊\", \"搅\", \"酱\", \"屏\", \"疫\", \"哀\", \"蔡\", \"堵\", \"沫\", \"皱\", \"畅\", \"叠\", \"阁\", \"莱\", \"敲\", \"辖\", \"钩\", \"痕\", \"坝\", \"巷\", \"饿\", \"祸\", \"丘\", \"玄\", \"溜\", \"曰\", \"逻\", \"彭\", \"尝\", \"卿\", \"妨\", \"艇\", \"吞\", \"韦\", \"怨\", \"矮\", \"歇\"]\n    static var traditionalChineseWords: [String] = [\"的\", \"一\", \"是\", \"在\", \"不\", \"了\", \"有\", \"和\", \"人\", \"這\", \"中\", \"大\", \"為\", \"上\", \"個\", \"國\", \"我\", \"以\", \"要\", \"他\", \"時\", \"來\", \"用\", \"們\", \"生\", \"到\", \"作\", \"地\", \"於\", \"出\", \"就\", \"分\", \"對\", \"成\", \"會\", \"可\", \"主\", \"發\", \"年\", \"動\", \"同\", \"工\", \"也\", \"能\", \"下\", \"過\", \"子\", \"說\", \"產\", \"種\", \"面\", \"而\", \"方\", \"後\", \"多\", \"定\", \"行\", \"學\", \"法\", \"所\", \"民\", \"得\", \"經\", \"十\", \"三\", \"之\", \"進\", \"著\", \"等\", \"部\", \"度\", \"家\", \"電\", \"力\", \"裡\", \"如\", \"水\", \"化\", \"高\", \"自\", \"二\", \"理\", \"起\", \"小\", \"物\", \"現\", \"實\", \"加\", \"量\", \"都\", \"兩\", \"體\", \"制\", \"機\", \"當\", \"使\", \"點\", \"從\", \"業\", \"本\", \"去\", \"把\", \"性\", \"好\", \"應\", \"開\", \"它\", \"合\", \"還\", \"因\", \"由\", \"其\", \"些\", \"然\", \"前\", \"外\", \"天\", \"政\", \"四\", \"日\", \"那\", \"社\", \"義\", \"事\", \"平\", \"形\", \"相\", \"全\", \"表\", \"間\", \"樣\", \"與\", \"關\", \"各\", \"重\", \"新\", \"線\", \"內\", \"數\", \"正\", \"心\", \"反\", \"你\", \"明\", \"看\", \"原\", \"又\", \"麼\", \"利\", \"比\", \"或\", \"但\", \"質\", \"氣\", \"第\", \"向\", \"道\", \"命\", \"此\", \"變\", \"條\", \"只\", \"沒\", \"結\", \"解\", \"問\", \"意\", \"建\", \"月\", \"公\", \"無\", \"系\", \"軍\", \"很\", \"情\", \"者\", \"最\", \"立\", \"代\", \"想\", \"已\", \"通\", \"並\", \"提\", \"直\", \"題\", \"黨\", \"程\", \"展\", \"五\", \"果\", \"料\", \"象\", \"員\", \"革\", \"位\", \"入\", \"常\", \"文\", \"總\", \"次\", \"品\", \"式\", \"活\", \"設\", \"及\", \"管\", \"特\", \"件\", \"長\", \"求\", \"老\", \"頭\", \"基\", \"資\", \"邊\", \"流\", \"路\", \"級\", \"少\", \"圖\", \"山\", \"統\", \"接\", \"知\", \"較\", \"將\", \"組\", \"見\", \"計\", \"別\", \"她\", \"手\", \"角\", \"期\", \"根\", \"論\", \"運\", \"農\", \"指\", \"幾\", \"九\", \"區\", \"強\", \"放\", \"決\", \"西\", \"被\", \"幹\", \"做\", \"必\", \"戰\", \"先\", \"回\", \"則\", \"任\", \"取\", \"據\", \"處\", \"隊\", \"南\", \"給\", \"色\", \"光\", \"門\", \"即\", \"保\", \"治\", \"北\", \"造\", \"百\", \"規\", \"熱\", \"領\", \"七\", \"海\", \"口\", \"東\", \"導\", \"器\", \"壓\", \"志\", \"世\", \"金\", \"增\", \"爭\", \"濟\", \"階\", \"油\", \"思\", \"術\", \"極\", \"交\", \"受\", \"聯\", \"什\", \"認\", \"六\", \"共\", \"權\", \"收\", \"證\", \"改\", \"清\", \"美\", \"再\", \"採\", \"轉\", \"更\", \"單\", \"風\", \"切\", \"打\", \"白\", \"教\", \"速\", \"花\", \"帶\", \"安\", \"場\", \"身\", \"車\", \"例\", \"真\", \"務\", \"具\", \"萬\", \"每\", \"目\", \"至\", \"達\", \"走\", \"積\", \"示\", \"議\", \"聲\", \"報\", \"鬥\", \"完\", \"類\", \"八\", \"離\", \"華\", \"名\", \"確\", \"才\", \"科\", \"張\", \"信\", \"馬\", \"節\", \"話\", \"米\", \"整\", \"空\", \"元\", \"況\", \"今\", \"集\", \"溫\", \"傳\", \"土\", \"許\", \"步\", \"群\", \"廣\", \"石\", \"記\", \"需\", \"段\", \"研\", \"界\", \"拉\", \"林\", \"律\", \"叫\", \"且\", \"究\", \"觀\", \"越\", \"織\", \"裝\", \"影\", \"算\", \"低\", \"持\", \"音\", \"眾\", \"書\", \"布\", \"复\", \"容\", \"兒\", \"須\", \"際\", \"商\", \"非\", \"驗\", \"連\", \"斷\", \"深\", \"難\", \"近\", \"礦\", \"千\", \"週\", \"委\", \"素\", \"技\", \"備\", \"半\", \"辦\", \"青\", \"省\", \"列\", \"習\", \"響\", \"約\", \"支\", \"般\", \"史\", \"感\", \"勞\", \"便\", \"團\", \"往\", \"酸\", \"歷\", \"市\", \"克\", \"何\", \"除\", \"消\", \"構\", \"府\", \"稱\", \"太\", \"準\", \"精\", \"值\", \"號\", \"率\", \"族\", \"維\", \"劃\", \"選\", \"標\", \"寫\", \"存\", \"候\", \"毛\", \"親\", \"快\", \"效\", \"斯\", \"院\", \"查\", \"江\", \"型\", \"眼\", \"王\", \"按\", \"格\", \"養\", \"易\", \"置\", \"派\", \"層\", \"片\", \"始\", \"卻\", \"專\", \"狀\", \"育\", \"廠\", \"京\", \"識\", \"適\", \"屬\", \"圓\", \"包\", \"火\", \"住\", \"調\", \"滿\", \"縣\", \"局\", \"照\", \"參\", \"紅\", \"細\", \"引\", \"聽\", \"該\", \"鐵\", \"價\", \"嚴\", \"首\", \"底\", \"液\", \"官\", \"德\", \"隨\", \"病\", \"蘇\", \"失\", \"爾\", \"死\", \"講\", \"配\", \"女\", \"黃\", \"推\", \"顯\", \"談\", \"罪\", \"神\", \"藝\", \"呢\", \"席\", \"含\", \"企\", \"望\", \"密\", \"批\", \"營\", \"項\", \"防\", \"舉\", \"球\", \"英\", \"氧\", \"勢\", \"告\", \"李\", \"台\", \"落\", \"木\", \"幫\", \"輪\", \"破\", \"亞\", \"師\", \"圍\", \"注\", \"遠\", \"字\", \"材\", \"排\", \"供\", \"河\", \"態\", \"封\", \"另\", \"施\", \"減\", \"樹\", \"溶\", \"怎\", \"止\", \"案\", \"言\", \"士\", \"均\", \"武\", \"固\", \"葉\", \"魚\", \"波\", \"視\", \"僅\", \"費\", \"緊\", \"愛\", \"左\", \"章\", \"早\", \"朝\", \"害\", \"續\", \"輕\", \"服\", \"試\", \"食\", \"充\", \"兵\", \"源\", \"判\", \"護\", \"司\", \"足\", \"某\", \"練\", \"差\", \"致\", \"板\", \"田\", \"降\", \"黑\", \"犯\", \"負\", \"擊\", \"范\", \"繼\", \"興\", \"似\", \"餘\", \"堅\", \"曲\", \"輸\", \"修\", \"故\", \"城\", \"夫\", \"夠\", \"送\", \"筆\", \"船\", \"佔\", \"右\", \"財\", \"吃\", \"富\", \"春\", \"職\", \"覺\", \"漢\", \"畫\", \"功\", \"巴\", \"跟\", \"雖\", \"雜\", \"飛\", \"檢\", \"吸\", \"助\", \"昇\", \"陽\", \"互\", \"初\", \"創\", \"抗\", \"考\", \"投\", \"壞\", \"策\", \"古\", \"徑\", \"換\", \"未\", \"跑\", \"留\", \"鋼\", \"曾\", \"端\", \"責\", \"站\", \"簡\", \"述\", \"錢\", \"副\", \"盡\", \"帝\", \"射\", \"草\", \"衝\", \"承\", \"獨\", \"令\", \"限\", \"阿\", \"宣\", \"環\", \"雙\", \"請\", \"超\", \"微\", \"讓\", \"控\", \"州\", \"良\", \"軸\", \"找\", \"否\", \"紀\", \"益\", \"依\", \"優\", \"頂\", \"礎\", \"載\", \"倒\", \"房\", \"突\", \"坐\", \"粉\", \"敵\", \"略\", \"客\", \"袁\", \"冷\", \"勝\", \"絕\", \"析\", \"塊\", \"劑\", \"測\", \"絲\", \"協\", \"訴\", \"念\", \"陳\", \"仍\", \"羅\", \"鹽\", \"友\", \"洋\", \"錯\", \"苦\", \"夜\", \"刑\", \"移\", \"頻\", \"逐\", \"靠\", \"混\", \"母\", \"短\", \"皮\", \"終\", \"聚\", \"汽\", \"村\", \"雲\", \"哪\", \"既\", \"距\", \"衛\", \"停\", \"烈\", \"央\", \"察\", \"燒\", \"迅\", \"境\", \"若\", \"印\", \"洲\", \"刻\", \"括\", \"激\", \"孔\", \"搞\", \"甚\", \"室\", \"待\", \"核\", \"校\", \"散\", \"侵\", \"吧\", \"甲\", \"遊\", \"久\", \"菜\", \"味\", \"舊\", \"模\", \"湖\", \"貨\", \"損\", \"預\", \"阻\", \"毫\", \"普\", \"穩\", \"乙\", \"媽\", \"植\", \"息\", \"擴\", \"銀\", \"語\", \"揮\", \"酒\", \"守\", \"拿\", \"序\", \"紙\", \"醫\", \"缺\", \"雨\", \"嗎\", \"針\", \"劉\", \"啊\", \"急\", \"唱\", \"誤\", \"訓\", \"願\", \"審\", \"附\", \"獲\", \"茶\", \"鮮\", \"糧\", \"斤\", \"孩\", \"脫\", \"硫\", \"肥\", \"善\", \"龍\", \"演\", \"父\", \"漸\", \"血\", \"歡\", \"械\", \"掌\", \"歌\", \"沙\", \"剛\", \"攻\", \"謂\", \"盾\", \"討\", \"晚\", \"粒\", \"亂\", \"燃\", \"矛\", \"乎\", \"殺\", \"藥\", \"寧\", \"魯\", \"貴\", \"鐘\", \"煤\", \"讀\", \"班\", \"伯\", \"香\", \"介\", \"迫\", \"句\", \"豐\", \"培\", \"握\", \"蘭\", \"擔\", \"弦\", \"蛋\", \"沉\", \"假\", \"穿\", \"執\", \"答\", \"樂\", \"誰\", \"順\", \"煙\", \"縮\", \"徵\", \"臉\", \"喜\", \"松\", \"腳\", \"困\", \"異\", \"免\", \"背\", \"星\", \"福\", \"買\", \"染\", \"井\", \"概\", \"慢\", \"怕\", \"磁\", \"倍\", \"祖\", \"皇\", \"促\", \"靜\", \"補\", \"評\", \"翻\", \"肉\", \"踐\", \"尼\", \"衣\", \"寬\", \"揚\", \"棉\", \"希\", \"傷\", \"操\", \"垂\", \"秋\", \"宜\", \"氫\", \"套\", \"督\", \"振\", \"架\", \"亮\", \"末\", \"憲\", \"慶\", \"編\", \"牛\", \"觸\", \"映\", \"雷\", \"銷\", \"詩\", \"座\", \"居\", \"抓\", \"裂\", \"胞\", \"呼\", \"娘\", \"景\", \"威\", \"綠\", \"晶\", \"厚\", \"盟\", \"衡\", \"雞\", \"孫\", \"延\", \"危\", \"膠\", \"屋\", \"鄉\", \"臨\", \"陸\", \"顧\", \"掉\", \"呀\", \"燈\", \"歲\", \"措\", \"束\", \"耐\", \"劇\", \"玉\", \"趙\", \"跳\", \"哥\", \"季\", \"課\", \"凱\", \"胡\", \"額\", \"款\", \"紹\", \"卷\", \"齊\", \"偉\", \"蒸\", \"殖\", \"永\", \"宗\", \"苗\", \"川\", \"爐\", \"岩\", \"弱\", \"零\", \"楊\", \"奏\", \"沿\", \"露\", \"桿\", \"探\", \"滑\", \"鎮\", \"飯\", \"濃\", \"航\", \"懷\", \"趕\", \"庫\", \"奪\", \"伊\", \"靈\", \"稅\", \"途\", \"滅\", \"賽\", \"歸\", \"召\", \"鼓\", \"播\", \"盤\", \"裁\", \"險\", \"康\", \"唯\", \"錄\", \"菌\", \"純\", \"借\", \"糖\", \"蓋\", \"橫\", \"符\", \"私\", \"努\", \"堂\", \"域\", \"槍\", \"潤\", \"幅\", \"哈\", \"竟\", \"熟\", \"蟲\", \"澤\", \"腦\", \"壤\", \"碳\", \"歐\", \"遍\", \"側\", \"寨\", \"敢\", \"徹\", \"慮\", \"斜\", \"薄\", \"庭\", \"納\", \"彈\", \"飼\", \"伸\", \"折\", \"麥\", \"濕\", \"暗\", \"荷\", \"瓦\", \"塞\", \"床\", \"築\", \"惡\", \"戶\", \"訪\", \"塔\", \"奇\", \"透\", \"梁\", \"刀\", \"旋\", \"跡\", \"卡\", \"氯\", \"遇\", \"份\", \"毒\", \"泥\", \"退\", \"洗\", \"擺\", \"灰\", \"彩\", \"賣\", \"耗\", \"夏\", \"擇\", \"忙\", \"銅\", \"獻\", \"硬\", \"予\", \"繁\", \"圈\", \"雪\", \"函\", \"亦\", \"抽\", \"篇\", \"陣\", \"陰\", \"丁\", \"尺\", \"追\", \"堆\", \"雄\", \"迎\", \"泛\", \"爸\", \"樓\", \"避\", \"謀\", \"噸\", \"野\", \"豬\", \"旗\", \"累\", \"偏\", \"典\", \"館\", \"索\", \"秦\", \"脂\", \"潮\", \"爺\", \"豆\", \"忽\", \"托\", \"驚\", \"塑\", \"遺\", \"愈\", \"朱\", \"替\", \"纖\", \"粗\", \"傾\", \"尚\", \"痛\", \"楚\", \"謝\", \"奮\", \"購\", \"磨\", \"君\", \"池\", \"旁\", \"碎\", \"骨\", \"監\", \"捕\", \"弟\", \"暴\", \"割\", \"貫\", \"殊\", \"釋\", \"詞\", \"亡\", \"壁\", \"頓\", \"寶\", \"午\", \"塵\", \"聞\", \"揭\", \"炮\", \"殘\", \"冬\", \"橋\", \"婦\", \"警\", \"綜\", \"招\", \"吳\", \"付\", \"浮\", \"遭\", \"徐\", \"您\", \"搖\", \"谷\", \"贊\", \"箱\", \"隔\", \"訂\", \"男\", \"吹\", \"園\", \"紛\", \"唐\", \"敗\", \"宋\", \"玻\", \"巨\", \"耕\", \"坦\", \"榮\", \"閉\", \"灣\", \"鍵\", \"凡\", \"駐\", \"鍋\", \"救\", \"恩\", \"剝\", \"凝\", \"鹼\", \"齒\", \"截\", \"煉\", \"麻\", \"紡\", \"禁\", \"廢\", \"盛\", \"版\", \"緩\", \"淨\", \"睛\", \"昌\", \"婚\", \"涉\", \"筒\", \"嘴\", \"插\", \"岸\", \"朗\", \"莊\", \"街\", \"藏\", \"姑\", \"貿\", \"腐\", \"奴\", \"啦\", \"慣\", \"乘\", \"夥\", \"恢\", \"勻\", \"紗\", \"扎\", \"辯\", \"耳\", \"彪\", \"臣\", \"億\", \"璃\", \"抵\", \"脈\", \"秀\", \"薩\", \"俄\", \"網\", \"舞\", \"店\", \"噴\", \"縱\", \"寸\", \"汗\", \"掛\", \"洪\", \"賀\", \"閃\", \"柬\", \"爆\", \"烯\", \"津\", \"稻\", \"牆\", \"軟\", \"勇\", \"像\", \"滾\", \"厘\", \"蒙\", \"芳\", \"肯\", \"坡\", \"柱\", \"盪\", \"腿\", \"儀\", \"旅\", \"尾\", \"軋\", \"冰\", \"貢\", \"登\", \"黎\", \"削\", \"鑽\", \"勒\", \"逃\", \"障\", \"氨\", \"郭\", \"峰\", \"幣\", \"港\", \"伏\", \"軌\", \"畝\", \"畢\", \"擦\", \"莫\", \"刺\", \"浪\", \"秘\", \"援\", \"株\", \"健\", \"售\", \"股\", \"島\", \"甘\", \"泡\", \"睡\", \"童\", \"鑄\", \"湯\", \"閥\", \"休\", \"匯\", \"舍\", \"牧\", \"繞\", \"炸\", \"哲\", \"磷\", \"績\", \"朋\", \"淡\", \"尖\", \"啟\", \"陷\", \"柴\", \"呈\", \"徒\", \"顏\", \"淚\", \"稍\", \"忘\", \"泵\", \"藍\", \"拖\", \"洞\", \"授\", \"鏡\", \"辛\", \"壯\", \"鋒\", \"貧\", \"虛\", \"彎\", \"摩\", \"泰\", \"幼\", \"廷\", \"尊\", \"窗\", \"綱\", \"弄\", \"隸\", \"疑\", \"氏\", \"宮\", \"姐\", \"震\", \"瑞\", \"怪\", \"尤\", \"琴\", \"循\", \"描\", \"膜\", \"違\", \"夾\", \"腰\", \"緣\", \"珠\", \"窮\", \"森\", \"枝\", \"竹\", \"溝\", \"催\", \"繩\", \"憶\", \"邦\", \"剩\", \"幸\", \"漿\", \"欄\", \"擁\", \"牙\", \"貯\", \"禮\", \"濾\", \"鈉\", \"紋\", \"罷\", \"拍\", \"咱\", \"喊\", \"袖\", \"埃\", \"勤\", \"罰\", \"焦\", \"潛\", \"伍\", \"墨\", \"欲\", \"縫\", \"姓\", \"刊\", \"飽\", \"仿\", \"獎\", \"鋁\", \"鬼\", \"麗\", \"跨\", \"默\", \"挖\", \"鏈\", \"掃\", \"喝\", \"袋\", \"炭\", \"污\", \"幕\", \"諸\", \"弧\", \"勵\", \"梅\", \"奶\", \"潔\", \"災\", \"舟\", \"鑑\", \"苯\", \"訟\", \"抱\", \"毀\", \"懂\", \"寒\", \"智\", \"埔\", \"寄\", \"屆\", \"躍\", \"渡\", \"挑\", \"丹\", \"艱\", \"貝\", \"碰\", \"拔\", \"爹\", \"戴\", \"碼\", \"夢\", \"芽\", \"熔\", \"赤\", \"漁\", \"哭\", \"敬\", \"顆\", \"奔\", \"鉛\", \"仲\", \"虎\", \"稀\", \"妹\", \"乏\", \"珍\", \"申\", \"桌\", \"遵\", \"允\", \"隆\", \"螺\", \"倉\", \"魏\", \"銳\", \"曉\", \"氮\", \"兼\", \"隱\", \"礙\", \"赫\", \"撥\", \"忠\", \"肅\", \"缸\", \"牽\", \"搶\", \"博\", \"巧\", \"殼\", \"兄\", \"杜\", \"訊\", \"誠\", \"碧\", \"祥\", \"柯\", \"頁\", \"巡\", \"矩\", \"悲\", \"灌\", \"齡\", \"倫\", \"票\", \"尋\", \"桂\", \"鋪\", \"聖\", \"恐\", \"恰\", \"鄭\", \"趣\", \"抬\", \"荒\", \"騰\", \"貼\", \"柔\", \"滴\", \"猛\", \"闊\", \"輛\", \"妻\", \"填\", \"撤\", \"儲\", \"簽\", \"鬧\", \"擾\", \"紫\", \"砂\", \"遞\", \"戲\", \"吊\", \"陶\", \"伐\", \"餵\", \"療\", \"瓶\", \"婆\", \"撫\", \"臂\", \"摸\", \"忍\", \"蝦\", \"蠟\", \"鄰\", \"胸\", \"鞏\", \"擠\", \"偶\", \"棄\", \"槽\", \"勁\", \"乳\", \"鄧\", \"吉\", \"仁\", \"爛\", \"磚\", \"租\", \"烏\", \"艦\", \"伴\", \"瓜\", \"淺\", \"丙\", \"暫\", \"燥\", \"橡\", \"柳\", \"迷\", \"暖\", \"牌\", \"秧\", \"膽\", \"詳\", \"簧\", \"踏\", \"瓷\", \"譜\", \"呆\", \"賓\", \"糊\", \"洛\", \"輝\", \"憤\", \"競\", \"隙\", \"怒\", \"粘\", \"乃\", \"緒\", \"肩\", \"籍\", \"敏\", \"塗\", \"熙\", \"皆\", \"偵\", \"懸\", \"掘\", \"享\", \"糾\", \"醒\", \"狂\", \"鎖\", \"淀\", \"恨\", \"牲\", \"霸\", \"爬\", \"賞\", \"逆\", \"玩\", \"陵\", \"祝\", \"秒\", \"浙\", \"貌\", \"役\", \"彼\", \"悉\", \"鴨\", \"趨\", \"鳳\", \"晨\", \"畜\", \"輩\", \"秩\", \"卵\", \"署\", \"梯\", \"炎\", \"灘\", \"棋\", \"驅\", \"篩\", \"峽\", \"冒\", \"啥\", \"壽\", \"譯\", \"浸\", \"泉\", \"帽\", \"遲\", \"矽\", \"疆\", \"貸\", \"漏\", \"稿\", \"冠\", \"嫩\", \"脅\", \"芯\", \"牢\", \"叛\", \"蝕\", \"奧\", \"鳴\", \"嶺\", \"羊\", \"憑\", \"串\", \"塘\", \"繪\", \"酵\", \"融\", \"盆\", \"錫\", \"廟\", \"籌\", \"凍\", \"輔\", \"攝\", \"襲\", \"筋\", \"拒\", \"僚\", \"旱\", \"鉀\", \"鳥\", \"漆\", \"沈\", \"眉\", \"疏\", \"添\", \"棒\", \"穗\", \"硝\", \"韓\", \"逼\", \"扭\", \"僑\", \"涼\", \"挺\", \"碗\", \"栽\", \"炒\", \"杯\", \"患\", \"餾\", \"勸\", \"豪\", \"遼\", \"勃\", \"鴻\", \"旦\", \"吏\", \"拜\", \"狗\", \"埋\", \"輥\", \"掩\", \"飲\", \"搬\", \"罵\", \"辭\", \"勾\", \"扣\", \"估\", \"蔣\", \"絨\", \"霧\", \"丈\", \"朵\", \"姆\", \"擬\", \"宇\", \"輯\", \"陝\", \"雕\", \"償\", \"蓄\", \"崇\", \"剪\", \"倡\", \"廳\", \"咬\", \"駛\", \"薯\", \"刷\", \"斥\", \"番\", \"賦\", \"奉\", \"佛\", \"澆\", \"漫\", \"曼\", \"扇\", \"鈣\", \"桃\", \"扶\", \"仔\", \"返\", \"俗\", \"虧\", \"腔\", \"鞋\", \"棱\", \"覆\", \"框\", \"悄\", \"叔\", \"撞\", \"騙\", \"勘\", \"旺\", \"沸\", \"孤\", \"吐\", \"孟\", \"渠\", \"屈\", \"疾\", \"妙\", \"惜\", \"仰\", \"狠\", \"脹\", \"諧\", \"拋\", \"黴\", \"桑\", \"崗\", \"嘛\", \"衰\", \"盜\", \"滲\", \"臟\", \"賴\", \"湧\", \"甜\", \"曹\", \"閱\", \"肌\", \"哩\", \"厲\", \"烴\", \"緯\", \"毅\", \"昨\", \"偽\", \"症\", \"煮\", \"嘆\", \"釘\", \"搭\", \"莖\", \"籠\", \"酷\", \"偷\", \"弓\", \"錐\", \"恆\", \"傑\", \"坑\", \"鼻\", \"翼\", \"綸\", \"敘\", \"獄\", \"逮\", \"罐\", \"絡\", \"棚\", \"抑\", \"膨\", \"蔬\", \"寺\", \"驟\", \"穆\", \"冶\", \"枯\", \"冊\", \"屍\", \"凸\", \"紳\", \"坯\", \"犧\", \"焰\", \"轟\", \"欣\", \"晉\", \"瘦\", \"禦\", \"錠\", \"錦\", \"喪\", \"旬\", \"鍛\", \"壟\", \"搜\", \"撲\", \"邀\", \"亭\", \"酯\", \"邁\", \"舒\", \"脆\", \"酶\", \"閒\", \"憂\", \"酚\", \"頑\", \"羽\", \"漲\", \"卸\", \"仗\", \"陪\", \"闢\", \"懲\", \"杭\", \"姚\", \"肚\", \"捉\", \"飄\", \"漂\", \"昆\", \"欺\", \"吾\", \"郎\", \"烷\", \"汁\", \"呵\", \"飾\", \"蕭\", \"雅\", \"郵\", \"遷\", \"燕\", \"撒\", \"姻\", \"赴\", \"宴\", \"煩\", \"債\", \"帳\", \"斑\", \"鈴\", \"旨\", \"醇\", \"董\", \"餅\", \"雛\", \"姿\", \"拌\", \"傅\", \"腹\", \"妥\", \"揉\", \"賢\", \"拆\", \"歪\", \"葡\", \"胺\", \"丟\", \"浩\", \"徽\", \"昂\", \"墊\", \"擋\", \"覽\", \"貪\", \"慰\", \"繳\", \"汪\", \"慌\", \"馮\", \"諾\", \"姜\", \"誼\", \"兇\", \"劣\", \"誣\", \"耀\", \"昏\", \"躺\", \"盈\", \"騎\", \"喬\", \"溪\", \"叢\", \"盧\", \"抹\", \"悶\", \"諮\", \"刮\", \"駕\", \"纜\", \"悟\", \"摘\", \"鉺\", \"擲\", \"頗\", \"幻\", \"柄\", \"惠\", \"慘\", \"佳\", \"仇\", \"臘\", \"窩\", \"滌\", \"劍\", \"瞧\", \"堡\", \"潑\", \"蔥\", \"罩\", \"霍\", \"撈\", \"胎\", \"蒼\", \"濱\", \"倆\", \"捅\", \"湘\", \"砍\", \"霞\", \"邵\", \"萄\", \"瘋\", \"淮\", \"遂\", \"熊\", \"糞\", \"烘\", \"宿\", \"檔\", \"戈\", \"駁\", \"嫂\", \"裕\", \"徙\", \"箭\", \"捐\", \"腸\", \"撐\", \"曬\", \"辨\", \"殿\", \"蓮\", \"攤\", \"攪\", \"醬\", \"屏\", \"疫\", \"哀\", \"蔡\", \"堵\", \"沫\", \"皺\", \"暢\", \"疊\", \"閣\", \"萊\", \"敲\", \"轄\", \"鉤\", \"痕\", \"壩\", \"巷\", \"餓\", \"禍\", \"丘\", \"玄\", \"溜\", \"曰\", \"邏\", \"彭\", \"嘗\", \"卿\", \"妨\", \"艇\", \"吞\", \"韋\", \"怨\", \"矮\", \"歇\"]\n    static var frenchWords: [String] = [\"abaisser\", \"abandon\", \"abdiquer\", \"abeille\", \"abolir\", \"aborder\", \"aboutir\", \"aboyer\", \"abrasif\", \"abreuver\", \"abriter\", \"abroger\", \"abrupt\", \"absence\", \"absolu\", \"absurde\", \"abusif\", \"abyssal\", \"académie\", \"acajou\", \"acarien\", \"accabler\", \"accepter\", \"acclamer\", \"accolade\", \"accroche\", \"accuser\", \"acerbe\", \"achat\", \"acheter\", \"aciduler\", \"acier\", \"acompte\", \"acquérir\", \"acronyme\", \"acteur\", \"actif\", \"actuel\", \"adepte\", \"adéquat\", \"adhésif\", \"adjectif\", \"adjuger\", \"admettre\", \"admirer\", \"adopter\", \"adorer\", \"adoucir\", \"adresse\", \"adroit\", \"adulte\", \"adverbe\", \"aérer\", \"aéronef\", \"affaire\", \"affecter\", \"affiche\", \"affreux\", \"affubler\", \"agacer\", \"agencer\", \"agile\", \"agiter\", \"agrafer\", \"agréable\", \"agrume\", \"aider\", \"aiguille\", \"ailier\", \"aimable\", \"aisance\", \"ajouter\", \"ajuster\", \"alarmer\", \"alchimie\", \"alerte\", \"algèbre\", \"algue\", \"aliéner\", \"aliment\", \"alléger\", \"alliage\", \"allouer\", \"allumer\", \"alourdir\", \"alpaga\", \"altesse\", \"alvéole\", \"amateur\", \"ambigu\", \"ambre\", \"aménager\", \"amertume\", \"amidon\", \"amiral\", \"amorcer\", \"amour\", \"amovible\", \"amphibie\", \"ampleur\", \"amusant\", \"analyse\", \"anaphore\", \"anarchie\", \"anatomie\", \"ancien\", \"anéantir\", \"angle\", \"angoisse\", \"anguleux\", \"animal\", \"annexer\", \"annonce\", \"annuel\", \"anodin\", \"anomalie\", \"anonyme\", \"anormal\", \"antenne\", \"antidote\", \"anxieux\", \"apaiser\", \"apéritif\", \"aplanir\", \"apologie\", \"appareil\", \"appeler\", \"apporter\", \"appuyer\", \"aquarium\", \"aqueduc\", \"arbitre\", \"arbuste\", \"ardeur\", \"ardoise\", \"argent\", \"arlequin\", \"armature\", \"armement\", \"armoire\", \"armure\", \"arpenter\", \"arracher\", \"arriver\", \"arroser\", \"arsenic\", \"artériel\", \"article\", \"aspect\", \"asphalte\", \"aspirer\", \"assaut\", \"asservir\", \"assiette\", \"associer\", \"assurer\", \"asticot\", \"astre\", \"astuce\", \"atelier\", \"atome\", \"atrium\", \"atroce\", \"attaque\", \"attentif\", \"attirer\", \"attraper\", \"aubaine\", \"auberge\", \"audace\", \"audible\", \"augurer\", \"aurore\", \"automne\", \"autruche\", \"avaler\", \"avancer\", \"avarice\", \"avenir\", \"averse\", \"aveugle\", \"aviateur\", \"avide\", \"avion\", \"aviser\", \"avoine\", \"avouer\", \"avril\", \"axial\", \"axiome\", \"badge\", \"bafouer\", \"bagage\", \"baguette\", \"baignade\", \"balancer\", \"balcon\", \"baleine\", \"balisage\", \"bambin\", \"bancaire\", \"bandage\", \"banlieue\", \"bannière\", \"banquier\", \"barbier\", \"baril\", \"baron\", \"barque\", \"barrage\", \"bassin\", \"bastion\", \"bataille\", \"bateau\", \"batterie\", \"baudrier\", \"bavarder\", \"belette\", \"bélier\", \"belote\", \"bénéfice\", \"berceau\", \"berger\", \"berline\", \"bermuda\", \"besace\", \"besogne\", \"bétail\", \"beurre\", \"biberon\", \"bicycle\", \"bidule\", \"bijou\", \"bilan\", \"bilingue\", \"billard\", \"binaire\", \"biologie\", \"biopsie\", \"biotype\", \"biscuit\", \"bison\", \"bistouri\", \"bitume\", \"bizarre\", \"blafard\", \"blague\", \"blanchir\", \"blessant\", \"blinder\", \"blond\", \"bloquer\", \"blouson\", \"bobard\", \"bobine\", \"boire\", \"boiser\", \"bolide\", \"bonbon\", \"bondir\", \"bonheur\", \"bonifier\", \"bonus\", \"bordure\", \"borne\", \"botte\", \"boucle\", \"boueux\", \"bougie\", \"boulon\", \"bouquin\", \"bourse\", \"boussole\", \"boutique\", \"boxeur\", \"branche\", \"brasier\", \"brave\", \"brebis\", \"brèche\", \"breuvage\", \"bricoler\", \"brigade\", \"brillant\", \"brioche\", \"brique\", \"brochure\", \"broder\", \"bronzer\", \"brousse\", \"broyeur\", \"brume\", \"brusque\", \"brutal\", \"bruyant\", \"buffle\", \"buisson\", \"bulletin\", \"bureau\", \"burin\", \"bustier\", \"butiner\", \"butoir\", \"buvable\", \"buvette\", \"cabanon\", \"cabine\", \"cachette\", \"cadeau\", \"cadre\", \"caféine\", \"caillou\", \"caisson\", \"calculer\", \"calepin\", \"calibre\", \"calmer\", \"calomnie\", \"calvaire\", \"camarade\", \"caméra\", \"camion\", \"campagne\", \"canal\", \"caneton\", \"canon\", \"cantine\", \"canular\", \"capable\", \"caporal\", \"caprice\", \"capsule\", \"capter\", \"capuche\", \"carabine\", \"carbone\", \"caresser\", \"caribou\", \"carnage\", \"carotte\", \"carreau\", \"carton\", \"cascade\", \"casier\", \"casque\", \"cassure\", \"causer\", \"caution\", \"cavalier\", \"caverne\", \"caviar\", \"cédille\", \"ceinture\", \"céleste\", \"cellule\", \"cendrier\", \"censurer\", \"central\", \"cercle\", \"cérébral\", \"cerise\", \"cerner\", \"cerveau\", \"cesser\", \"chagrin\", \"chaise\", \"chaleur\", \"chambre\", \"chance\", \"chapitre\", \"charbon\", \"chasseur\", \"chaton\", \"chausson\", \"chavirer\", \"chemise\", \"chenille\", \"chéquier\", \"chercher\", \"cheval\", \"chien\", \"chiffre\", \"chignon\", \"chimère\", \"chiot\", \"chlorure\", \"chocolat\", \"choisir\", \"chose\", \"chouette\", \"chrome\", \"chute\", \"cigare\", \"cigogne\", \"cimenter\", \"cinéma\", \"cintrer\", \"circuler\", \"cirer\", \"cirque\", \"citerne\", \"citoyen\", \"citron\", \"civil\", \"clairon\", \"clameur\", \"claquer\", \"classe\", \"clavier\", \"client\", \"cligner\", \"climat\", \"clivage\", \"cloche\", \"clonage\", \"cloporte\", \"cobalt\", \"cobra\", \"cocasse\", \"cocotier\", \"coder\", \"codifier\", \"coffre\", \"cogner\", \"cohésion\", \"coiffer\", \"coincer\", \"colère\", \"colibri\", \"colline\", \"colmater\", \"colonel\", \"combat\", \"comédie\", \"commande\", \"compact\", \"concert\", \"conduire\", \"confier\", \"congeler\", \"connoter\", \"consonne\", \"contact\", \"convexe\", \"copain\", \"copie\", \"corail\", \"corbeau\", \"cordage\", \"corniche\", \"corpus\", \"correct\", \"cortège\", \"cosmique\", \"costume\", \"coton\", \"coude\", \"coupure\", \"courage\", \"couteau\", \"couvrir\", \"coyote\", \"crabe\", \"crainte\", \"cravate\", \"crayon\", \"créature\", \"créditer\", \"crémeux\", \"creuser\", \"crevette\", \"cribler\", \"crier\", \"cristal\", \"critère\", \"croire\", \"croquer\", \"crotale\", \"crucial\", \"cruel\", \"crypter\", \"cubique\", \"cueillir\", \"cuillère\", \"cuisine\", \"cuivre\", \"culminer\", \"cultiver\", \"cumuler\", \"cupide\", \"curatif\", \"curseur\", \"cyanure\", \"cycle\", \"cylindre\", \"cynique\", \"daigner\", \"damier\", \"danger\", \"danseur\", \"dauphin\", \"débattre\", \"débiter\", \"déborder\", \"débrider\", \"débutant\", \"décaler\", \"décembre\", \"déchirer\", \"décider\", \"déclarer\", \"décorer\", \"décrire\", \"décupler\", \"dédale\", \"déductif\", \"déesse\", \"défensif\", \"défiler\", \"défrayer\", \"dégager\", \"dégivrer\", \"déglutir\", \"dégrafer\", \"déjeuner\", \"délice\", \"déloger\", \"demander\", \"demeurer\", \"démolir\", \"dénicher\", \"dénouer\", \"dentelle\", \"dénuder\", \"départ\", \"dépenser\", \"déphaser\", \"déplacer\", \"déposer\", \"déranger\", \"dérober\", \"désastre\", \"descente\", \"désert\", \"désigner\", \"désobéir\", \"dessiner\", \"destrier\", \"détacher\", \"détester\", \"détourer\", \"détresse\", \"devancer\", \"devenir\", \"deviner\", \"devoir\", \"diable\", \"dialogue\", \"diamant\", \"dicter\", \"différer\", \"digérer\", \"digital\", \"digne\", \"diluer\", \"dimanche\", \"diminuer\", \"dioxyde\", \"directif\", \"diriger\", \"discuter\", \"disposer\", \"dissiper\", \"distance\", \"divertir\", \"diviser\", \"docile\", \"docteur\", \"dogme\", \"doigt\", \"domaine\", \"domicile\", \"dompter\", \"donateur\", \"donjon\", \"donner\", \"dopamine\", \"dortoir\", \"dorure\", \"dosage\", \"doseur\", \"dossier\", \"dotation\", \"douanier\", \"double\", \"douceur\", \"douter\", \"doyen\", \"dragon\", \"draper\", \"dresser\", \"dribbler\", \"droiture\", \"duperie\", \"duplexe\", \"durable\", \"durcir\", \"dynastie\", \"éblouir\", \"écarter\", \"écharpe\", \"échelle\", \"éclairer\", \"éclipse\", \"éclore\", \"écluse\", \"école\", \"économie\", \"écorce\", \"écouter\", \"écraser\", \"écrémer\", \"écrivain\", \"écrou\", \"écume\", \"écureuil\", \"édifier\", \"éduquer\", \"effacer\", \"effectif\", \"effigie\", \"effort\", \"effrayer\", \"effusion\", \"égaliser\", \"égarer\", \"éjecter\", \"élaborer\", \"élargir\", \"électron\", \"élégant\", \"éléphant\", \"élève\", \"éligible\", \"élitisme\", \"éloge\", \"élucider\", \"éluder\", \"emballer\", \"embellir\", \"embryon\", \"émeraude\", \"émission\", \"emmener\", \"émotion\", \"émouvoir\", \"empereur\", \"employer\", \"emporter\", \"emprise\", \"émulsion\", \"encadrer\", \"enchère\", \"enclave\", \"encoche\", \"endiguer\", \"endosser\", \"endroit\", \"enduire\", \"énergie\", \"enfance\", \"enfermer\", \"enfouir\", \"engager\", \"engin\", \"englober\", \"énigme\", \"enjamber\", \"enjeu\", \"enlever\", \"ennemi\", \"ennuyeux\", \"enrichir\", \"enrobage\", \"enseigne\", \"entasser\", \"entendre\", \"entier\", \"entourer\", \"entraver\", \"énumérer\", \"envahir\", \"enviable\", \"envoyer\", \"enzyme\", \"éolien\", \"épaissir\", \"épargne\", \"épatant\", \"épaule\", \"épicerie\", \"épidémie\", \"épier\", \"épilogue\", \"épine\", \"épisode\", \"épitaphe\", \"époque\", \"épreuve\", \"éprouver\", \"épuisant\", \"équerre\", \"équipe\", \"ériger\", \"érosion\", \"erreur\", \"éruption\", \"escalier\", \"espadon\", \"espèce\", \"espiègle\", \"espoir\", \"esprit\", \"esquiver\", \"essayer\", \"essence\", \"essieu\", \"essorer\", \"estime\", \"estomac\", \"estrade\", \"étagère\", \"étaler\", \"étanche\", \"étatique\", \"éteindre\", \"étendoir\", \"éternel\", \"éthanol\", \"éthique\", \"ethnie\", \"étirer\", \"étoffer\", \"étoile\", \"étonnant\", \"étourdir\", \"étrange\", \"étroit\", \"étude\", \"euphorie\", \"évaluer\", \"évasion\", \"éventail\", \"évidence\", \"éviter\", \"évolutif\", \"évoquer\", \"exact\", \"exagérer\", \"exaucer\", \"exceller\", \"excitant\", \"exclusif\", \"excuse\", \"exécuter\", \"exemple\", \"exercer\", \"exhaler\", \"exhorter\", \"exigence\", \"exiler\", \"exister\", \"exotique\", \"expédier\", \"explorer\", \"exposer\", \"exprimer\", \"exquis\", \"extensif\", \"extraire\", \"exulter\", \"fable\", \"fabuleux\", \"facette\", \"facile\", \"facture\", \"faiblir\", \"falaise\", \"fameux\", \"famille\", \"farceur\", \"farfelu\", \"farine\", \"farouche\", \"fasciner\", \"fatal\", \"fatigue\", \"faucon\", \"fautif\", \"faveur\", \"favori\", \"fébrile\", \"féconder\", \"fédérer\", \"félin\", \"femme\", \"fémur\", \"fendoir\", \"féodal\", \"fermer\", \"féroce\", \"ferveur\", \"festival\", \"feuille\", \"feutre\", \"février\", \"fiasco\", \"ficeler\", \"fictif\", \"fidèle\", \"figure\", \"filature\", \"filetage\", \"filière\", \"filleul\", \"filmer\", \"filou\", \"filtrer\", \"financer\", \"finir\", \"fiole\", \"firme\", \"fissure\", \"fixer\", \"flairer\", \"flamme\", \"flasque\", \"flatteur\", \"fléau\", \"flèche\", \"fleur\", \"flexion\", \"flocon\", \"flore\", \"fluctuer\", \"fluide\", \"fluvial\", \"folie\", \"fonderie\", \"fongible\", \"fontaine\", \"forcer\", \"forgeron\", \"formuler\", \"fortune\", \"fossile\", \"foudre\", \"fougère\", \"fouiller\", \"foulure\", \"fourmi\", \"fragile\", \"fraise\", \"franchir\", \"frapper\", \"frayeur\", \"frégate\", \"freiner\", \"frelon\", \"frémir\", \"frénésie\", \"frère\", \"friable\", \"friction\", \"frisson\", \"frivole\", \"froid\", \"fromage\", \"frontal\", \"frotter\", \"fruit\", \"fugitif\", \"fuite\", \"fureur\", \"furieux\", \"furtif\", \"fusion\", \"futur\", \"gagner\", \"galaxie\", \"galerie\", \"gambader\", \"garantir\", \"gardien\", \"garnir\", \"garrigue\", \"gazelle\", \"gazon\", \"géant\", \"gélatine\", \"gélule\", \"gendarme\", \"général\", \"génie\", \"genou\", \"gentil\", \"géologie\", \"géomètre\", \"géranium\", \"germe\", \"gestuel\", \"geyser\", \"gibier\", \"gicler\", \"girafe\", \"givre\", \"glace\", \"glaive\", \"glisser\", \"globe\", \"gloire\", \"glorieux\", \"golfeur\", \"gomme\", \"gonfler\", \"gorge\", \"gorille\", \"goudron\", \"gouffre\", \"goulot\", \"goupille\", \"gourmand\", \"goutte\", \"graduel\", \"graffiti\", \"graine\", \"grand\", \"grappin\", \"gratuit\", \"gravir\", \"grenat\", \"griffure\", \"griller\", \"grimper\", \"grogner\", \"gronder\", \"grotte\", \"groupe\", \"gruger\", \"grutier\", \"gruyère\", \"guépard\", \"guerrier\", \"guide\", \"guimauve\", \"guitare\", \"gustatif\", \"gymnaste\", \"gyrostat\", \"habitude\", \"hachoir\", \"halte\", \"hameau\", \"hangar\", \"hanneton\", \"haricot\", \"harmonie\", \"harpon\", \"hasard\", \"hélium\", \"hématome\", \"herbe\", \"hérisson\", \"hermine\", \"héron\", \"hésiter\", \"heureux\", \"hiberner\", \"hibou\", \"hilarant\", \"histoire\", \"hiver\", \"homard\", \"hommage\", \"homogène\", \"honneur\", \"honorer\", \"honteux\", \"horde\", \"horizon\", \"horloge\", \"hormone\", \"horrible\", \"houleux\", \"housse\", \"hublot\", \"huileux\", \"humain\", \"humble\", \"humide\", \"humour\", \"hurler\", \"hydromel\", \"hygiène\", \"hymne\", \"hypnose\", \"idylle\", \"ignorer\", \"iguane\", \"illicite\", \"illusion\", \"image\", \"imbiber\", \"imiter\", \"immense\", \"immobile\", \"immuable\", \"impact\", \"impérial\", \"implorer\", \"imposer\", \"imprimer\", \"imputer\", \"incarner\", \"incendie\", \"incident\", \"incliner\", \"incolore\", \"indexer\", \"indice\", \"inductif\", \"inédit\", \"ineptie\", \"inexact\", \"infini\", \"infliger\", \"informer\", \"infusion\", \"ingérer\", \"inhaler\", \"inhiber\", \"injecter\", \"injure\", \"innocent\", \"inoculer\", \"inonder\", \"inscrire\", \"insecte\", \"insigne\", \"insolite\", \"inspirer\", \"instinct\", \"insulter\", \"intact\", \"intense\", \"intime\", \"intrigue\", \"intuitif\", \"inutile\", \"invasion\", \"inventer\", \"inviter\", \"invoquer\", \"ironique\", \"irradier\", \"irréel\", \"irriter\", \"isoler\", \"ivoire\", \"ivresse\", \"jaguar\", \"jaillir\", \"jambe\", \"janvier\", \"jardin\", \"jauger\", \"jaune\", \"javelot\", \"jetable\", \"jeton\", \"jeudi\", \"jeunesse\", \"joindre\", \"joncher\", \"jongler\", \"joueur\", \"jouissif\", \"journal\", \"jovial\", \"joyau\", \"joyeux\", \"jubiler\", \"jugement\", \"junior\", \"jupon\", \"juriste\", \"justice\", \"juteux\", \"juvénile\", \"kayak\", \"kimono\", \"kiosque\", \"label\", \"labial\", \"labourer\", \"lacérer\", \"lactose\", \"lagune\", \"laine\", \"laisser\", \"laitier\", \"lambeau\", \"lamelle\", \"lampe\", \"lanceur\", \"langage\", \"lanterne\", \"lapin\", \"largeur\", \"larme\", \"laurier\", \"lavabo\", \"lavoir\", \"lecture\", \"légal\", \"léger\", \"légume\", \"lessive\", \"lettre\", \"levier\", \"lexique\", \"lézard\", \"liasse\", \"libérer\", \"libre\", \"licence\", \"licorne\", \"liège\", \"lièvre\", \"ligature\", \"ligoter\", \"ligue\", \"limer\", \"limite\", \"limonade\", \"limpide\", \"linéaire\", \"lingot\", \"lionceau\", \"liquide\", \"lisière\", \"lister\", \"lithium\", \"litige\", \"littoral\", \"livreur\", \"logique\", \"lointain\", \"loisir\", \"lombric\", \"loterie\", \"louer\", \"lourd\", \"loutre\", \"louve\", \"loyal\", \"lubie\", \"lucide\", \"lucratif\", \"lueur\", \"lugubre\", \"luisant\", \"lumière\", \"lunaire\", \"lundi\", \"luron\", \"lutter\", \"luxueux\", \"machine\", \"magasin\", \"magenta\", \"magique\", \"maigre\", \"maillon\", \"maintien\", \"mairie\", \"maison\", \"majorer\", \"malaxer\", \"maléfice\", \"malheur\", \"malice\", \"mallette\", \"mammouth\", \"mandater\", \"maniable\", \"manquant\", \"manteau\", \"manuel\", \"marathon\", \"marbre\", \"marchand\", \"mardi\", \"maritime\", \"marqueur\", \"marron\", \"marteler\", \"mascotte\", \"massif\", \"matériel\", \"matière\", \"matraque\", \"maudire\", \"maussade\", \"mauve\", \"maximal\", \"méchant\", \"méconnu\", \"médaille\", \"médecin\", \"méditer\", \"méduse\", \"meilleur\", \"mélange\", \"mélodie\", \"membre\", \"mémoire\", \"menacer\", \"mener\", \"menhir\", \"mensonge\", \"mentor\", \"mercredi\", \"mérite\", \"merle\", \"messager\", \"mesure\", \"métal\", \"météore\", \"méthode\", \"métier\", \"meuble\", \"miauler\", \"microbe\", \"miette\", \"mignon\", \"migrer\", \"milieu\", \"million\", \"mimique\", \"mince\", \"minéral\", \"minimal\", \"minorer\", \"minute\", \"miracle\", \"miroiter\", \"missile\", \"mixte\", \"mobile\", \"moderne\", \"moelleux\", \"mondial\", \"moniteur\", \"monnaie\", \"monotone\", \"monstre\", \"montagne\", \"monument\", \"moqueur\", \"morceau\", \"morsure\", \"mortier\", \"moteur\", \"motif\", \"mouche\", \"moufle\", \"moulin\", \"mousson\", \"mouton\", \"mouvant\", \"multiple\", \"munition\", \"muraille\", \"murène\", \"murmure\", \"muscle\", \"muséum\", \"musicien\", \"mutation\", \"muter\", \"mutuel\", \"myriade\", \"myrtille\", \"mystère\", \"mythique\", \"nageur\", \"nappe\", \"narquois\", \"narrer\", \"natation\", \"nation\", \"nature\", \"naufrage\", \"nautique\", \"navire\", \"nébuleux\", \"nectar\", \"néfaste\", \"négation\", \"négliger\", \"négocier\", \"neige\", \"nerveux\", \"nettoyer\", \"neurone\", \"neutron\", \"neveu\", \"niche\", \"nickel\", \"nitrate\", \"niveau\", \"noble\", \"nocif\", \"nocturne\", \"noirceur\", \"noisette\", \"nomade\", \"nombreux\", \"nommer\", \"normatif\", \"notable\", \"notifier\", \"notoire\", \"nourrir\", \"nouveau\", \"novateur\", \"novembre\", \"novice\", \"nuage\", \"nuancer\", \"nuire\", \"nuisible\", \"numéro\", \"nuptial\", \"nuque\", \"nutritif\", \"obéir\", \"objectif\", \"obliger\", \"obscur\", \"observer\", \"obstacle\", \"obtenir\", \"obturer\", \"occasion\", \"occuper\", \"océan\", \"octobre\", \"octroyer\", \"octupler\", \"oculaire\", \"odeur\", \"odorant\", \"offenser\", \"officier\", \"offrir\", \"ogive\", \"oiseau\", \"oisillon\", \"olfactif\", \"olivier\", \"ombrage\", \"omettre\", \"onctueux\", \"onduler\", \"onéreux\", \"onirique\", \"opale\", \"opaque\", \"opérer\", \"opinion\", \"opportun\", \"opprimer\", \"opter\", \"optique\", \"orageux\", \"orange\", \"orbite\", \"ordonner\", \"oreille\", \"organe\", \"orgueil\", \"orifice\", \"ornement\", \"orque\", \"ortie\", \"osciller\", \"osmose\", \"ossature\", \"otarie\", \"ouragan\", \"ourson\", \"outil\", \"outrager\", \"ouvrage\", \"ovation\", \"oxyde\", \"oxygène\", \"ozone\", \"paisible\", \"palace\", \"palmarès\", \"palourde\", \"palper\", \"panache\", \"panda\", \"pangolin\", \"paniquer\", \"panneau\", \"panorama\", \"pantalon\", \"papaye\", \"papier\", \"papoter\", \"papyrus\", \"paradoxe\", \"parcelle\", \"paresse\", \"parfumer\", \"parler\", \"parole\", \"parrain\", \"parsemer\", \"partager\", \"parure\", \"parvenir\", \"passion\", \"pastèque\", \"paternel\", \"patience\", \"patron\", \"pavillon\", \"pavoiser\", \"payer\", \"paysage\", \"peigne\", \"peintre\", \"pelage\", \"pélican\", \"pelle\", \"pelouse\", \"peluche\", \"pendule\", \"pénétrer\", \"pénible\", \"pensif\", \"pénurie\", \"pépite\", \"péplum\", \"perdrix\", \"perforer\", \"période\", \"permuter\", \"perplexe\", \"persil\", \"perte\", \"peser\", \"pétale\", \"petit\", \"pétrir\", \"peuple\", \"pharaon\", \"phobie\", \"phoque\", \"photon\", \"phrase\", \"physique\", \"piano\", \"pictural\", \"pièce\", \"pierre\", \"pieuvre\", \"pilote\", \"pinceau\", \"pipette\", \"piquer\", \"pirogue\", \"piscine\", \"piston\", \"pivoter\", \"pixel\", \"pizza\", \"placard\", \"plafond\", \"plaisir\", \"planer\", \"plaque\", \"plastron\", \"plateau\", \"pleurer\", \"plexus\", \"pliage\", \"plomb\", \"plonger\", \"pluie\", \"plumage\", \"pochette\", \"poésie\", \"poète\", \"pointe\", \"poirier\", \"poisson\", \"poivre\", \"polaire\", \"policier\", \"pollen\", \"polygone\", \"pommade\", \"pompier\", \"ponctuel\", \"pondérer\", \"poney\", \"portique\", \"position\", \"posséder\", \"posture\", \"potager\", \"poteau\", \"potion\", \"pouce\", \"poulain\", \"poumon\", \"pourpre\", \"poussin\", \"pouvoir\", \"prairie\", \"pratique\", \"précieux\", \"prédire\", \"préfixe\", \"prélude\", \"prénom\", \"présence\", \"prétexte\", \"prévoir\", \"primitif\", \"prince\", \"prison\", \"priver\", \"problème\", \"procéder\", \"prodige\", \"profond\", \"progrès\", \"proie\", \"projeter\", \"prologue\", \"promener\", \"propre\", \"prospère\", \"protéger\", \"prouesse\", \"proverbe\", \"prudence\", \"pruneau\", \"psychose\", \"public\", \"puceron\", \"puiser\", \"pulpe\", \"pulsar\", \"punaise\", \"punitif\", \"pupitre\", \"purifier\", \"puzzle\", \"pyramide\", \"quasar\", \"querelle\", \"question\", \"quiétude\", \"quitter\", \"quotient\", \"racine\", \"raconter\", \"radieux\", \"ragondin\", \"raideur\", \"raisin\", \"ralentir\", \"rallonge\", \"ramasser\", \"rapide\", \"rasage\", \"ratisser\", \"ravager\", \"ravin\", \"rayonner\", \"réactif\", \"réagir\", \"réaliser\", \"réanimer\", \"recevoir\", \"réciter\", \"réclamer\", \"récolter\", \"recruter\", \"reculer\", \"recycler\", \"rédiger\", \"redouter\", \"refaire\", \"réflexe\", \"réformer\", \"refrain\", \"refuge\", \"régalien\", \"région\", \"réglage\", \"régulier\", \"réitérer\", \"rejeter\", \"rejouer\", \"relatif\", \"relever\", \"relief\", \"remarque\", \"remède\", \"remise\", \"remonter\", \"remplir\", \"remuer\", \"renard\", \"renfort\", \"renifler\", \"renoncer\", \"rentrer\", \"renvoi\", \"replier\", \"reporter\", \"reprise\", \"reptile\", \"requin\", \"réserve\", \"résineux\", \"résoudre\", \"respect\", \"rester\", \"résultat\", \"rétablir\", \"retenir\", \"réticule\", \"retomber\", \"retracer\", \"réunion\", \"réussir\", \"revanche\", \"revivre\", \"révolte\", \"révulsif\", \"richesse\", \"rideau\", \"rieur\", \"rigide\", \"rigoler\", \"rincer\", \"riposter\", \"risible\", \"risque\", \"rituel\", \"rival\", \"rivière\", \"rocheux\", \"romance\", \"rompre\", \"ronce\", \"rondin\", \"roseau\", \"rosier\", \"rotatif\", \"rotor\", \"rotule\", \"rouge\", \"rouille\", \"rouleau\", \"routine\", \"royaume\", \"ruban\", \"rubis\", \"ruche\", \"ruelle\", \"rugueux\", \"ruiner\", \"ruisseau\", \"ruser\", \"rustique\", \"rythme\", \"sabler\", \"saboter\", \"sabre\", \"sacoche\", \"safari\", \"sagesse\", \"saisir\", \"salade\", \"salive\", \"salon\", \"saluer\", \"samedi\", \"sanction\", \"sanglier\", \"sarcasme\", \"sardine\", \"saturer\", \"saugrenu\", \"saumon\", \"sauter\", \"sauvage\", \"savant\", \"savonner\", \"scalpel\", \"scandale\", \"scélérat\", \"scénario\", \"sceptre\", \"schéma\", \"science\", \"scinder\", \"score\", \"scrutin\", \"sculpter\", \"séance\", \"sécable\", \"sécher\", \"secouer\", \"sécréter\", \"sédatif\", \"séduire\", \"seigneur\", \"séjour\", \"sélectif\", \"semaine\", \"sembler\", \"semence\", \"séminal\", \"sénateur\", \"sensible\", \"sentence\", \"séparer\", \"séquence\", \"serein\", \"sergent\", \"sérieux\", \"serrure\", \"sérum\", \"service\", \"sésame\", \"sévir\", \"sevrage\", \"sextuple\", \"sidéral\", \"siècle\", \"siéger\", \"siffler\", \"sigle\", \"signal\", \"silence\", \"silicium\", \"simple\", \"sincère\", \"sinistre\", \"siphon\", \"sirop\", \"sismique\", \"situer\", \"skier\", \"social\", \"socle\", \"sodium\", \"soigneux\", \"soldat\", \"soleil\", \"solitude\", \"soluble\", \"sombre\", \"sommeil\", \"somnoler\", \"sonde\", \"songeur\", \"sonnette\", \"sonore\", \"sorcier\", \"sortir\", \"sosie\", \"sottise\", \"soucieux\", \"soudure\", \"souffle\", \"soulever\", \"soupape\", \"source\", \"soutirer\", \"souvenir\", \"spacieux\", \"spatial\", \"spécial\", \"sphère\", \"spiral\", \"stable\", \"station\", \"sternum\", \"stimulus\", \"stipuler\", \"strict\", \"studieux\", \"stupeur\", \"styliste\", \"sublime\", \"substrat\", \"subtil\", \"subvenir\", \"succès\", \"sucre\", \"suffixe\", \"suggérer\", \"suiveur\", \"sulfate\", \"superbe\", \"supplier\", \"surface\", \"suricate\", \"surmener\", \"surprise\", \"sursaut\", \"survie\", \"suspect\", \"syllabe\", \"symbole\", \"symétrie\", \"synapse\", \"syntaxe\", \"système\", \"tabac\", \"tablier\", \"tactile\", \"tailler\", \"talent\", \"talisman\", \"talonner\", \"tambour\", \"tamiser\", \"tangible\", \"tapis\", \"taquiner\", \"tarder\", \"tarif\", \"tartine\", \"tasse\", \"tatami\", \"tatouage\", \"taupe\", \"taureau\", \"taxer\", \"témoin\", \"temporel\", \"tenaille\", \"tendre\", \"teneur\", \"tenir\", \"tension\", \"terminer\", \"terne\", \"terrible\", \"tétine\", \"texte\", \"thème\", \"théorie\", \"thérapie\", \"thorax\", \"tibia\", \"tiède\", \"timide\", \"tirelire\", \"tiroir\", \"tissu\", \"titane\", \"titre\", \"tituber\", \"toboggan\", \"tolérant\", \"tomate\", \"tonique\", \"tonneau\", \"toponyme\", \"torche\", \"tordre\", \"tornade\", \"torpille\", \"torrent\", \"torse\", \"tortue\", \"totem\", \"toucher\", \"tournage\", \"tousser\", \"toxine\", \"traction\", \"trafic\", \"tragique\", \"trahir\", \"train\", \"trancher\", \"travail\", \"trèfle\", \"tremper\", \"trésor\", \"treuil\", \"triage\", \"tribunal\", \"tricoter\", \"trilogie\", \"triomphe\", \"tripler\", \"triturer\", \"trivial\", \"trombone\", \"tronc\", \"tropical\", \"troupeau\", \"tuile\", \"tulipe\", \"tumulte\", \"tunnel\", \"turbine\", \"tuteur\", \"tutoyer\", \"tuyau\", \"tympan\", \"typhon\", \"typique\", \"tyran\", \"ubuesque\", \"ultime\", \"ultrason\", \"unanime\", \"unifier\", \"union\", \"unique\", \"unitaire\", \"univers\", \"uranium\", \"urbain\", \"urticant\", \"usage\", \"usine\", \"usuel\", \"usure\", \"utile\", \"utopie\", \"vacarme\", \"vaccin\", \"vagabond\", \"vague\", \"vaillant\", \"vaincre\", \"vaisseau\", \"valable\", \"valise\", \"vallon\", \"valve\", \"vampire\", \"vanille\", \"vapeur\", \"varier\", \"vaseux\", \"vassal\", \"vaste\", \"vecteur\", \"vedette\", \"végétal\", \"véhicule\", \"veinard\", \"véloce\", \"vendredi\", \"vénérer\", \"venger\", \"venimeux\", \"ventouse\", \"verdure\", \"vérin\", \"vernir\", \"verrou\", \"verser\", \"vertu\", \"veston\", \"vétéran\", \"vétuste\", \"vexant\", \"vexer\", \"viaduc\", \"viande\", \"victoire\", \"vidange\", \"vidéo\", \"vignette\", \"vigueur\", \"vilain\", \"village\", \"vinaigre\", \"violon\", \"vipère\", \"virement\", \"virtuose\", \"virus\", \"visage\", \"viseur\", \"vision\", \"visqueux\", \"visuel\", \"vital\", \"vitesse\", \"viticole\", \"vitrine\", \"vivace\", \"vivipare\", \"vocation\", \"voguer\", \"voile\", \"voisin\", \"voiture\", \"volaille\", \"volcan\", \"voltiger\", \"volume\", \"vorace\", \"vortex\", \"voter\", \"vouloir\", \"voyage\", \"voyelle\", \"wagon\", \"xénon\", \"yacht\", \"zèbre\", \"zénith\", \"zeste\", \"zoologie\"]\n    static var italianWords: [String] = [\"abaco\", \"abbaglio\", \"abbinato\", \"abete\", \"abisso\", \"abolire\", \"abrasivo\", \"abrogato\", \"accadere\", \"accenno\", \"accusato\", \"acetone\", \"achille\", \"acido\", \"acqua\", \"acre\", \"acrilico\", \"acrobata\", \"acuto\", \"adagio\", \"addebito\", \"addome\", \"adeguato\", \"aderire\", \"adipe\", \"adottare\", \"adulare\", \"affabile\", \"affetto\", \"affisso\", \"affranto\", \"aforisma\", \"afoso\", \"africano\", \"agave\", \"agente\", \"agevole\", \"aggancio\", \"agire\", \"agitare\", \"agonismo\", \"agricolo\", \"agrumeto\", \"aguzzo\", \"alabarda\", \"alato\", \"albatro\", \"alberato\", \"albo\", \"albume\", \"alce\", \"alcolico\", \"alettone\", \"alfa\", \"algebra\", \"aliante\", \"alibi\", \"alimento\", \"allagato\", \"allegro\", \"allievo\", \"allodola\", \"allusivo\", \"almeno\", \"alogeno\", \"alpaca\", \"alpestre\", \"altalena\", \"alterno\", \"alticcio\", \"altrove\", \"alunno\", \"alveolo\", \"alzare\", \"amalgama\", \"amanita\", \"amarena\", \"ambito\", \"ambrato\", \"ameba\", \"america\", \"ametista\", \"amico\", \"ammasso\", \"ammenda\", \"ammirare\", \"ammonito\", \"amore\", \"ampio\", \"ampliare\", \"amuleto\", \"anacardo\", \"anagrafe\", \"analista\", \"anarchia\", \"anatra\", \"anca\", \"ancella\", \"ancora\", \"andare\", \"andrea\", \"anello\", \"angelo\", \"angolare\", \"angusto\", \"anima\", \"annegare\", \"annidato\", \"anno\", \"annuncio\", \"anonimo\", \"anticipo\", \"anzi\", \"apatico\", \"apertura\", \"apode\", \"apparire\", \"appetito\", \"appoggio\", \"approdo\", \"appunto\", \"aprile\", \"arabica\", \"arachide\", \"aragosta\", \"araldica\", \"arancio\", \"aratura\", \"arazzo\", \"arbitro\", \"archivio\", \"ardito\", \"arenile\", \"argento\", \"argine\", \"arguto\", \"aria\", \"armonia\", \"arnese\", \"arredato\", \"arringa\", \"arrosto\", \"arsenico\", \"arso\", \"artefice\", \"arzillo\", \"asciutto\", \"ascolto\", \"asepsi\", \"asettico\", \"asfalto\", \"asino\", \"asola\", \"aspirato\", \"aspro\", \"assaggio\", \"asse\", \"assoluto\", \"assurdo\", \"asta\", \"astenuto\", \"astice\", \"astratto\", \"atavico\", \"ateismo\", \"atomico\", \"atono\", \"attesa\", \"attivare\", \"attorno\", \"attrito\", \"attuale\", \"ausilio\", \"austria\", \"autista\", \"autonomo\", \"autunno\", \"avanzato\", \"avere\", \"avvenire\", \"avviso\", \"avvolgere\", \"azione\", \"azoto\", \"azzimo\", \"azzurro\", \"babele\", \"baccano\", \"bacino\", \"baco\", \"badessa\", \"badilata\", \"bagnato\", \"baita\", \"balcone\", \"baldo\", \"balena\", \"ballata\", \"balzano\", \"bambino\", \"bandire\", \"baraonda\", \"barbaro\", \"barca\", \"baritono\", \"barlume\", \"barocco\", \"basilico\", \"basso\", \"batosta\", \"battuto\", \"baule\", \"bava\", \"bavosa\", \"becco\", \"beffa\", \"belgio\", \"belva\", \"benda\", \"benevole\", \"benigno\", \"benzina\", \"bere\", \"berlina\", \"beta\", \"bibita\", \"bici\", \"bidone\", \"bifido\", \"biga\", \"bilancia\", \"bimbo\", \"binocolo\", \"biologo\", \"bipede\", \"bipolare\", \"birbante\", \"birra\", \"biscotto\", \"bisesto\", \"bisnonno\", \"bisonte\", \"bisturi\", \"bizzarro\", \"blando\", \"blatta\", \"bollito\", \"bonifico\", \"bordo\", \"bosco\", \"botanico\", \"bottino\", \"bozzolo\", \"braccio\", \"bradipo\", \"brama\", \"branca\", \"bravura\", \"bretella\", \"brevetto\", \"brezza\", \"briglia\", \"brillante\", \"brindare\", \"broccolo\", \"brodo\", \"bronzina\", \"brullo\", \"bruno\", \"bubbone\", \"buca\", \"budino\", \"buffone\", \"buio\", \"bulbo\", \"buono\", \"burlone\", \"burrasca\", \"bussola\", \"busta\", \"cadetto\", \"caduco\", \"calamaro\", \"calcolo\", \"calesse\", \"calibro\", \"calmo\", \"caloria\", \"cambusa\", \"camerata\", \"camicia\", \"cammino\", \"camola\", \"campale\", \"canapa\", \"candela\", \"cane\", \"canino\", \"canotto\", \"cantina\", \"capace\", \"capello\", \"capitolo\", \"capogiro\", \"cappero\", \"capra\", \"capsula\", \"carapace\", \"carcassa\", \"cardo\", \"carisma\", \"carovana\", \"carretto\", \"cartolina\", \"casaccio\", \"cascata\", \"caserma\", \"caso\", \"cassone\", \"castello\", \"casuale\", \"catasta\", \"catena\", \"catrame\", \"cauto\", \"cavillo\", \"cedibile\", \"cedrata\", \"cefalo\", \"celebre\", \"cellulare\", \"cena\", \"cenone\", \"centesimo\", \"ceramica\", \"cercare\", \"certo\", \"cerume\", \"cervello\", \"cesoia\", \"cespo\", \"ceto\", \"chela\", \"chiaro\", \"chicca\", \"chiedere\", \"chimera\", \"china\", \"chirurgo\", \"chitarra\", \"ciao\", \"ciclismo\", \"cifrare\", \"cigno\", \"cilindro\", \"ciottolo\", \"circa\", \"cirrosi\", \"citrico\", \"cittadino\", \"ciuffo\", \"civetta\", \"civile\", \"classico\", \"clinica\", \"cloro\", \"cocco\", \"codardo\", \"codice\", \"coerente\", \"cognome\", \"collare\", \"colmato\", \"colore\", \"colposo\", \"coltivato\", \"colza\", \"coma\", \"cometa\", \"commando\", \"comodo\", \"computer\", \"comune\", \"conciso\", \"condurre\", \"conferma\", \"congelare\", \"coniuge\", \"connesso\", \"conoscere\", \"consumo\", \"continuo\", \"convegno\", \"coperto\", \"copione\", \"coppia\", \"copricapo\", \"corazza\", \"cordata\", \"coricato\", \"cornice\", \"corolla\", \"corpo\", \"corredo\", \"corsia\", \"cortese\", \"cosmico\", \"costante\", \"cottura\", \"covato\", \"cratere\", \"cravatta\", \"creato\", \"credere\", \"cremoso\", \"crescita\", \"creta\", \"criceto\", \"crinale\", \"crisi\", \"critico\", \"croce\", \"cronaca\", \"crostata\", \"cruciale\", \"crusca\", \"cucire\", \"cuculo\", \"cugino\", \"cullato\", \"cupola\", \"curatore\", \"cursore\", \"curvo\", \"cuscino\", \"custode\", \"dado\", \"daino\", \"dalmata\", \"damerino\", \"daniela\", \"dannoso\", \"danzare\", \"datato\", \"davanti\", \"davvero\", \"debutto\", \"decennio\", \"deciso\", \"declino\", \"decollo\", \"decreto\", \"dedicato\", \"definito\", \"deforme\", \"degno\", \"delegare\", \"delfino\", \"delirio\", \"delta\", \"demenza\", \"denotato\", \"dentro\", \"deposito\", \"derapata\", \"derivare\", \"deroga\", \"descritto\", \"deserto\", \"desiderio\", \"desumere\", \"detersivo\", \"devoto\", \"diametro\", \"dicembre\", \"diedro\", \"difeso\", \"diffuso\", \"digerire\", \"digitale\", \"diluvio\", \"dinamico\", \"dinnanzi\", \"dipinto\", \"diploma\", \"dipolo\", \"diradare\", \"dire\", \"dirotto\", \"dirupo\", \"disagio\", \"discreto\", \"disfare\", \"disgelo\", \"disposto\", \"distanza\", \"disumano\", \"dito\", \"divano\", \"divelto\", \"dividere\", \"divorato\", \"doblone\", \"docente\", \"doganale\", \"dogma\", \"dolce\", \"domato\", \"domenica\", \"dominare\", \"dondolo\", \"dono\", \"dormire\", \"dote\", \"dottore\", \"dovuto\", \"dozzina\", \"drago\", \"druido\", \"dubbio\", \"dubitare\", \"ducale\", \"duna\", \"duomo\", \"duplice\", \"duraturo\", \"ebano\", \"eccesso\", \"ecco\", \"eclissi\", \"economia\", \"edera\", \"edicola\", \"edile\", \"editoria\", \"educare\", \"egemonia\", \"egli\", \"egoismo\", \"egregio\", \"elaborato\", \"elargire\", \"elegante\", \"elencato\", \"eletto\", \"elevare\", \"elfico\", \"elica\", \"elmo\", \"elsa\", \"eluso\", \"emanato\", \"emblema\", \"emesso\", \"emiro\", \"emotivo\", \"emozione\", \"empirico\", \"emulo\", \"endemico\", \"enduro\", \"energia\", \"enfasi\", \"enoteca\", \"entrare\", \"enzima\", \"epatite\", \"epilogo\", \"episodio\", \"epocale\", \"eppure\", \"equatore\", \"erario\", \"erba\", \"erboso\", \"erede\", \"eremita\", \"erigere\", \"ermetico\", \"eroe\", \"erosivo\", \"errante\", \"esagono\", \"esame\", \"esanime\", \"esaudire\", \"esca\", \"esempio\", \"esercito\", \"esibito\", \"esigente\", \"esistere\", \"esito\", \"esofago\", \"esortato\", \"esoso\", \"espanso\", \"espresso\", \"essenza\", \"esso\", \"esteso\", \"estimare\", \"estonia\", \"estroso\", \"esultare\", \"etilico\", \"etnico\", \"etrusco\", \"etto\", \"euclideo\", \"europa\", \"evaso\", \"evidenza\", \"evitato\", \"evoluto\", \"evviva\", \"fabbrica\", \"faccenda\", \"fachiro\", \"falco\", \"famiglia\", \"fanale\", \"fanfara\", \"fango\", \"fantasma\", \"fare\", \"farfalla\", \"farinoso\", \"farmaco\", \"fascia\", \"fastoso\", \"fasullo\", \"faticare\", \"fato\", \"favoloso\", \"febbre\", \"fecola\", \"fede\", \"fegato\", \"felpa\", \"feltro\", \"femmina\", \"fendere\", \"fenomeno\", \"fermento\", \"ferro\", \"fertile\", \"fessura\", \"festivo\", \"fetta\", \"feudo\", \"fiaba\", \"fiducia\", \"fifa\", \"figurato\", \"filo\", \"finanza\", \"finestra\", \"finire\", \"fiore\", \"fiscale\", \"fisico\", \"fiume\", \"flacone\", \"flamenco\", \"flebo\", \"flemma\", \"florido\", \"fluente\", \"fluoro\", \"fobico\", \"focaccia\", \"focoso\", \"foderato\", \"foglio\", \"folata\", \"folclore\", \"folgore\", \"fondente\", \"fonetico\", \"fonia\", \"fontana\", \"forbito\", \"forchetta\", \"foresta\", \"formica\", \"fornaio\", \"foro\", \"fortezza\", \"forzare\", \"fosfato\", \"fosso\", \"fracasso\", \"frana\", \"frassino\", \"fratello\", \"freccetta\", \"frenata\", \"fresco\", \"frigo\", \"frollino\", \"fronde\", \"frugale\", \"frutta\", \"fucilata\", \"fucsia\", \"fuggente\", \"fulmine\", \"fulvo\", \"fumante\", \"fumetto\", \"fumoso\", \"fune\", \"funzione\", \"fuoco\", \"furbo\", \"furgone\", \"furore\", \"fuso\", \"futile\", \"gabbiano\", \"gaffe\", \"galateo\", \"gallina\", \"galoppo\", \"gambero\", \"gamma\", \"garanzia\", \"garbo\", \"garofano\", \"garzone\", \"gasdotto\", \"gasolio\", \"gastrico\", \"gatto\", \"gaudio\", \"gazebo\", \"gazzella\", \"geco\", \"gelatina\", \"gelso\", \"gemello\", \"gemmato\", \"gene\", \"genitore\", \"gennaio\", \"genotipo\", \"gergo\", \"ghepardo\", \"ghiaccio\", \"ghisa\", \"giallo\", \"gilda\", \"ginepro\", \"giocare\", \"gioiello\", \"giorno\", \"giove\", \"girato\", \"girone\", \"gittata\", \"giudizio\", \"giurato\", \"giusto\", \"globulo\", \"glutine\", \"gnomo\", \"gobba\", \"golf\", \"gomito\", \"gommone\", \"gonfio\", \"gonna\", \"governo\", \"gracile\", \"grado\", \"grafico\", \"grammo\", \"grande\", \"grattare\", \"gravoso\", \"grazia\", \"greca\", \"gregge\", \"grifone\", \"grigio\", \"grinza\", \"grotta\", \"gruppo\", \"guadagno\", \"guaio\", \"guanto\", \"guardare\", \"gufo\", \"guidare\", \"ibernato\", \"icona\", \"identico\", \"idillio\", \"idolo\", \"idra\", \"idrico\", \"idrogeno\", \"igiene\", \"ignaro\", \"ignorato\", \"ilare\", \"illeso\", \"illogico\", \"illudere\", \"imballo\", \"imbevuto\", \"imbocco\", \"imbuto\", \"immane\", \"immerso\", \"immolato\", \"impacco\", \"impeto\", \"impiego\", \"importo\", \"impronta\", \"inalare\", \"inarcare\", \"inattivo\", \"incanto\", \"incendio\", \"inchino\", \"incisivo\", \"incluso\", \"incontro\", \"incrocio\", \"incubo\", \"indagine\", \"india\", \"indole\", \"inedito\", \"infatti\", \"infilare\", \"inflitto\", \"ingaggio\", \"ingegno\", \"inglese\", \"ingordo\", \"ingrosso\", \"innesco\", \"inodore\", \"inoltrare\", \"inondato\", \"insano\", \"insetto\", \"insieme\", \"insonnia\", \"insulina\", \"intasato\", \"intero\", \"intonaco\", \"intuito\", \"inumidire\", \"invalido\", \"invece\", \"invito\", \"iperbole\", \"ipnotico\", \"ipotesi\", \"ippica\", \"iride\", \"irlanda\", \"ironico\", \"irrigato\", \"irrorare\", \"isolato\", \"isotopo\", \"isterico\", \"istituto\", \"istrice\", \"italia\", \"iterare\", \"labbro\", \"labirinto\", \"lacca\", \"lacerato\", \"lacrima\", \"lacuna\", \"laddove\", \"lago\", \"lampo\", \"lancetta\", \"lanterna\", \"lardoso\", \"larga\", \"laringe\", \"lastra\", \"latenza\", \"latino\", \"lattuga\", \"lavagna\", \"lavoro\", \"legale\", \"leggero\", \"lembo\", \"lentezza\", \"lenza\", \"leone\", \"lepre\", \"lesivo\", \"lessato\", \"lesto\", \"letterale\", \"leva\", \"levigato\", \"libero\", \"lido\", \"lievito\", \"lilla\", \"limatura\", \"limitare\", \"limpido\", \"lineare\", \"lingua\", \"liquido\", \"lira\", \"lirica\", \"lisca\", \"lite\", \"litigio\", \"livrea\", \"locanda\", \"lode\", \"logica\", \"lombare\", \"londra\", \"longevo\", \"loquace\", \"lorenzo\", \"loto\", \"lotteria\", \"luce\", \"lucidato\", \"lumaca\", \"luminoso\", \"lungo\", \"lupo\", \"luppolo\", \"lusinga\", \"lusso\", \"lutto\", \"macabro\", \"macchina\", \"macero\", \"macinato\", \"madama\", \"magico\", \"maglia\", \"magnete\", \"magro\", \"maiolica\", \"malafede\", \"malgrado\", \"malinteso\", \"malsano\", \"malto\", \"malumore\", \"mana\", \"mancia\", \"mandorla\", \"mangiare\", \"manifesto\", \"mannaro\", \"manovra\", \"mansarda\", \"mantide\", \"manubrio\", \"mappa\", \"maratona\", \"marcire\", \"maretta\", \"marmo\", \"marsupio\", \"maschera\", \"massaia\", \"mastino\", \"materasso\", \"matricola\", \"mattone\", \"maturo\", \"mazurca\", \"meandro\", \"meccanico\", \"mecenate\", \"medesimo\", \"meditare\", \"mega\", \"melassa\", \"melis\", \"melodia\", \"meninge\", \"meno\", \"mensola\", \"mercurio\", \"merenda\", \"merlo\", \"meschino\", \"mese\", \"messere\", \"mestolo\", \"metallo\", \"metodo\", \"mettere\", \"miagolare\", \"mica\", \"micelio\", \"michele\", \"microbo\", \"midollo\", \"miele\", \"migliore\", \"milano\", \"milite\", \"mimosa\", \"minerale\", \"mini\", \"minore\", \"mirino\", \"mirtillo\", \"miscela\", \"missiva\", \"misto\", \"misurare\", \"mitezza\", \"mitigare\", \"mitra\", \"mittente\", \"mnemonico\", \"modello\", \"modifica\", \"modulo\", \"mogano\", \"mogio\", \"mole\", \"molosso\", \"monastero\", \"monco\", \"mondina\", \"monetario\", \"monile\", \"monotono\", \"monsone\", \"montato\", \"monviso\", \"mora\", \"mordere\", \"morsicato\", \"mostro\", \"motivato\", \"motosega\", \"motto\", \"movenza\", \"movimento\", \"mozzo\", \"mucca\", \"mucosa\", \"muffa\", \"mughetto\", \"mugnaio\", \"mulatto\", \"mulinello\", \"multiplo\", \"mummia\", \"munto\", \"muovere\", \"murale\", \"musa\", \"muscolo\", \"musica\", \"mutevole\", \"muto\", \"nababbo\", \"nafta\", \"nanometro\", \"narciso\", \"narice\", \"narrato\", \"nascere\", \"nastrare\", \"naturale\", \"nautica\", \"naviglio\", \"nebulosa\", \"necrosi\", \"negativo\", \"negozio\", \"nemmeno\", \"neofita\", \"neretto\", \"nervo\", \"nessuno\", \"nettuno\", \"neutrale\", \"neve\", \"nevrotico\", \"nicchia\", \"ninfa\", \"nitido\", \"nobile\", \"nocivo\", \"nodo\", \"nome\", \"nomina\", \"nordico\", \"normale\", \"norvegese\", \"nostrano\", \"notare\", \"notizia\", \"notturno\", \"novella\", \"nucleo\", \"nulla\", \"numero\", \"nuovo\", \"nutrire\", \"nuvola\", \"nuziale\", \"oasi\", \"obbedire\", \"obbligo\", \"obelisco\", \"oblio\", \"obolo\", \"obsoleto\", \"occasione\", \"occhio\", \"occidente\", \"occorrere\", \"occultare\", \"ocra\", \"oculato\", \"odierno\", \"odorare\", \"offerta\", \"offrire\", \"offuscato\", \"oggetto\", \"oggi\", \"ognuno\", \"olandese\", \"olfatto\", \"oliato\", \"oliva\", \"ologramma\", \"oltre\", \"omaggio\", \"ombelico\", \"ombra\", \"omega\", \"omissione\", \"ondoso\", \"onere\", \"onice\", \"onnivoro\", \"onorevole\", \"onta\", \"operato\", \"opinione\", \"opposto\", \"oracolo\", \"orafo\", \"ordine\", \"orecchino\", \"orefice\", \"orfano\", \"organico\", \"origine\", \"orizzonte\", \"orma\", \"ormeggio\", \"ornativo\", \"orologio\", \"orrendo\", \"orribile\", \"ortensia\", \"ortica\", \"orzata\", \"orzo\", \"osare\", \"oscurare\", \"osmosi\", \"ospedale\", \"ospite\", \"ossa\", \"ossidare\", \"ostacolo\", \"oste\", \"otite\", \"otre\", \"ottagono\", \"ottimo\", \"ottobre\", \"ovale\", \"ovest\", \"ovino\", \"oviparo\", \"ovocito\", \"ovunque\", \"ovviare\", \"ozio\", \"pacchetto\", \"pace\", \"pacifico\", \"padella\", \"padrone\", \"paese\", \"paga\", \"pagina\", \"palazzina\", \"palesare\", \"pallido\", \"palo\", \"palude\", \"pandoro\", \"pannello\", \"paolo\", \"paonazzo\", \"paprica\", \"parabola\", \"parcella\", \"parere\", \"pargolo\", \"pari\", \"parlato\", \"parola\", \"partire\", \"parvenza\", \"parziale\", \"passivo\", \"pasticca\", \"patacca\", \"patologia\", \"pattume\", \"pavone\", \"peccato\", \"pedalare\", \"pedonale\", \"peggio\", \"peloso\", \"penare\", \"pendice\", \"penisola\", \"pennuto\", \"penombra\", \"pensare\", \"pentola\", \"pepe\", \"pepita\", \"perbene\", \"percorso\", \"perdonato\", \"perforare\", \"pergamena\", \"periodo\", \"permesso\", \"perno\", \"perplesso\", \"persuaso\", \"pertugio\", \"pervaso\", \"pesatore\", \"pesista\", \"peso\", \"pestifero\", \"petalo\", \"pettine\", \"petulante\", \"pezzo\", \"piacere\", \"pianta\", \"piattino\", \"piccino\", \"picozza\", \"piega\", \"pietra\", \"piffero\", \"pigiama\", \"pigolio\", \"pigro\", \"pila\", \"pilifero\", \"pillola\", \"pilota\", \"pimpante\", \"pineta\", \"pinna\", \"pinolo\", \"pioggia\", \"piombo\", \"piramide\", \"piretico\", \"pirite\", \"pirolisi\", \"pitone\", \"pizzico\", \"placebo\", \"planare\", \"plasma\", \"platano\", \"plenario\", \"pochezza\", \"poderoso\", \"podismo\", \"poesia\", \"poggiare\", \"polenta\", \"poligono\", \"pollice\", \"polmonite\", \"polpetta\", \"polso\", \"poltrona\", \"polvere\", \"pomice\", \"pomodoro\", \"ponte\", \"popoloso\", \"porfido\", \"poroso\", \"porpora\", \"porre\", \"portata\", \"posa\", \"positivo\", \"possesso\", \"postulato\", \"potassio\", \"potere\", \"pranzo\", \"prassi\", \"pratica\", \"precluso\", \"predica\", \"prefisso\", \"pregiato\", \"prelievo\", \"premere\", \"prenotare\", \"preparato\", \"presenza\", \"pretesto\", \"prevalso\", \"prima\", \"principe\", \"privato\", \"problema\", \"procura\", \"produrre\", \"profumo\", \"progetto\", \"prolunga\", \"promessa\", \"pronome\", \"proposta\", \"proroga\", \"proteso\", \"prova\", \"prudente\", \"prugna\", \"prurito\", \"psiche\", \"pubblico\", \"pudica\", \"pugilato\", \"pugno\", \"pulce\", \"pulito\", \"pulsante\", \"puntare\", \"pupazzo\", \"pupilla\", \"puro\", \"quadro\", \"qualcosa\", \"quasi\", \"querela\", \"quota\", \"raccolto\", \"raddoppio\", \"radicale\", \"radunato\", \"raffica\", \"ragazzo\", \"ragione\", \"ragno\", \"ramarro\", \"ramingo\", \"ramo\", \"randagio\", \"rantolare\", \"rapato\", \"rapina\", \"rappreso\", \"rasatura\", \"raschiato\", \"rasente\", \"rassegna\", \"rastrello\", \"rata\", \"ravveduto\", \"reale\", \"recepire\", \"recinto\", \"recluta\", \"recondito\", \"recupero\", \"reddito\", \"redimere\", \"regalato\", \"registro\", \"regola\", \"regresso\", \"relazione\", \"remare\", \"remoto\", \"renna\", \"replica\", \"reprimere\", \"reputare\", \"resa\", \"residente\", \"responso\", \"restauro\", \"rete\", \"retina\", \"retorica\", \"rettifica\", \"revocato\", \"riassunto\", \"ribadire\", \"ribelle\", \"ribrezzo\", \"ricarica\", \"ricco\", \"ricevere\", \"riciclato\", \"ricordo\", \"ricreduto\", \"ridicolo\", \"ridurre\", \"rifasare\", \"riflesso\", \"riforma\", \"rifugio\", \"rigare\", \"rigettato\", \"righello\", \"rilassato\", \"rilevato\", \"rimanere\", \"rimbalzo\", \"rimedio\", \"rimorchio\", \"rinascita\", \"rincaro\", \"rinforzo\", \"rinnovo\", \"rinomato\", \"rinsavito\", \"rintocco\", \"rinuncia\", \"rinvenire\", \"riparato\", \"ripetuto\", \"ripieno\", \"riportare\", \"ripresa\", \"ripulire\", \"risata\", \"rischio\", \"riserva\", \"risibile\", \"riso\", \"rispetto\", \"ristoro\", \"risultato\", \"risvolto\", \"ritardo\", \"ritegno\", \"ritmico\", \"ritrovo\", \"riunione\", \"riva\", \"riverso\", \"rivincita\", \"rivolto\", \"rizoma\", \"roba\", \"robotico\", \"robusto\", \"roccia\", \"roco\", \"rodaggio\", \"rodere\", \"roditore\", \"rogito\", \"rollio\", \"romantico\", \"rompere\", \"ronzio\", \"rosolare\", \"rospo\", \"rotante\", \"rotondo\", \"rotula\", \"rovescio\", \"rubizzo\", \"rubrica\", \"ruga\", \"rullino\", \"rumine\", \"rumoroso\", \"ruolo\", \"rupe\", \"russare\", \"rustico\", \"sabato\", \"sabbiare\", \"sabotato\", \"sagoma\", \"salasso\", \"saldatura\", \"salgemma\", \"salivare\", \"salmone\", \"salone\", \"saltare\", \"saluto\", \"salvo\", \"sapere\", \"sapido\", \"saporito\", \"saraceno\", \"sarcasmo\", \"sarto\", \"sassoso\", \"satellite\", \"satira\", \"satollo\", \"saturno\", \"savana\", \"savio\", \"saziato\", \"sbadiglio\", \"sbalzo\", \"sbancato\", \"sbarra\", \"sbattere\", \"sbavare\", \"sbendare\", \"sbirciare\", \"sbloccato\", \"sbocciato\", \"sbrinare\", \"sbruffone\", \"sbuffare\", \"scabroso\", \"scadenza\", \"scala\", \"scambiare\", \"scandalo\", \"scapola\", \"scarso\", \"scatenare\", \"scavato\", \"scelto\", \"scenico\", \"scettro\", \"scheda\", \"schiena\", \"sciarpa\", \"scienza\", \"scindere\", \"scippo\", \"sciroppo\", \"scivolo\", \"sclerare\", \"scodella\", \"scolpito\", \"scomparto\", \"sconforto\", \"scoprire\", \"scorta\", \"scossone\", \"scozzese\", \"scriba\", \"scrollare\", \"scrutinio\", \"scuderia\", \"scultore\", \"scuola\", \"scuro\", \"scusare\", \"sdebitare\", \"sdoganare\", \"seccatura\", \"secondo\", \"sedano\", \"seggiola\", \"segnalato\", \"segregato\", \"seguito\", \"selciato\", \"selettivo\", \"sella\", \"selvaggio\", \"semaforo\", \"sembrare\", \"seme\", \"seminato\", \"sempre\", \"senso\", \"sentire\", \"sepolto\", \"sequenza\", \"serata\", \"serbato\", \"sereno\", \"serio\", \"serpente\", \"serraglio\", \"servire\", \"sestina\", \"setola\", \"settimana\", \"sfacelo\", \"sfaldare\", \"sfamato\", \"sfarzoso\", \"sfaticato\", \"sfera\", \"sfida\", \"sfilato\", \"sfinge\", \"sfocato\", \"sfoderare\", \"sfogo\", \"sfoltire\", \"sforzato\", \"sfratto\", \"sfruttato\", \"sfuggito\", \"sfumare\", \"sfuso\", \"sgabello\", \"sgarbato\", \"sgonfiare\", \"sgorbio\", \"sgrassato\", \"sguardo\", \"sibilo\", \"siccome\", \"sierra\", \"sigla\", \"signore\", \"silenzio\", \"sillaba\", \"simbolo\", \"simpatico\", \"simulato\", \"sinfonia\", \"singolo\", \"sinistro\", \"sino\", \"sintesi\", \"sinusoide\", \"sipario\", \"sisma\", \"sistole\", \"situato\", \"slitta\", \"slogatura\", \"sloveno\", \"smarrito\", \"smemorato\", \"smentito\", \"smeraldo\", \"smilzo\", \"smontare\", \"smottato\", \"smussato\", \"snellire\", \"snervato\", \"snodo\", \"sobbalzo\", \"sobrio\", \"soccorso\", \"sociale\", \"sodale\", \"soffitto\", \"sogno\", \"soldato\", \"solenne\", \"solido\", \"sollazzo\", \"solo\", \"solubile\", \"solvente\", \"somatico\", \"somma\", \"sonda\", \"sonetto\", \"sonnifero\", \"sopire\", \"soppeso\", \"sopra\", \"sorgere\", \"sorpasso\", \"sorriso\", \"sorso\", \"sorteggio\", \"sorvolato\", \"sospiro\", \"sosta\", \"sottile\", \"spada\", \"spalla\", \"spargere\", \"spatola\", \"spavento\", \"spazzola\", \"specie\", \"spedire\", \"spegnere\", \"spelatura\", \"speranza\", \"spessore\", \"spettrale\", \"spezzato\", \"spia\", \"spigoloso\", \"spillato\", \"spinoso\", \"spirale\", \"splendido\", \"sportivo\", \"sposo\", \"spranga\", \"sprecare\", \"spronato\", \"spruzzo\", \"spuntino\", \"squillo\", \"sradicare\", \"srotolato\", \"stabile\", \"stacco\", \"staffa\", \"stagnare\", \"stampato\", \"stantio\", \"starnuto\", \"stasera\", \"statuto\", \"stelo\", \"steppa\", \"sterzo\", \"stiletto\", \"stima\", \"stirpe\", \"stivale\", \"stizzoso\", \"stonato\", \"storico\", \"strappo\", \"stregato\", \"stridulo\", \"strozzare\", \"strutto\", \"stuccare\", \"stufo\", \"stupendo\", \"subentro\", \"succoso\", \"sudore\", \"suggerito\", \"sugo\", \"sultano\", \"suonare\", \"superbo\", \"supporto\", \"surgelato\", \"surrogato\", \"sussurro\", \"sutura\", \"svagare\", \"svedese\", \"sveglio\", \"svelare\", \"svenuto\", \"svezia\", \"sviluppo\", \"svista\", \"svizzera\", \"svolta\", \"svuotare\", \"tabacco\", \"tabulato\", \"tacciare\", \"taciturno\", \"tale\", \"talismano\", \"tampone\", \"tannino\", \"tara\", \"tardivo\", \"targato\", \"tariffa\", \"tarpare\", \"tartaruga\", \"tasto\", \"tattico\", \"taverna\", \"tavolata\", \"tazza\", \"teca\", \"tecnico\", \"telefono\", \"temerario\", \"tempo\", \"temuto\", \"tendone\", \"tenero\", \"tensione\", \"tentacolo\", \"teorema\", \"terme\", \"terrazzo\", \"terzetto\", \"tesi\", \"tesserato\", \"testato\", \"tetro\", \"tettoia\", \"tifare\", \"tigella\", \"timbro\", \"tinto\", \"tipico\", \"tipografo\", \"tiraggio\", \"tiro\", \"titanio\", \"titolo\", \"titubante\", \"tizio\", \"tizzone\", \"toccare\", \"tollerare\", \"tolto\", \"tombola\", \"tomo\", \"tonfo\", \"tonsilla\", \"topazio\", \"topologia\", \"toppa\", \"torba\", \"tornare\", \"torrone\", \"tortora\", \"toscano\", \"tossire\", \"tostatura\", \"totano\", \"trabocco\", \"trachea\", \"trafila\", \"tragedia\", \"tralcio\", \"tramonto\", \"transito\", \"trapano\", \"trarre\", \"trasloco\", \"trattato\", \"trave\", \"treccia\", \"tremolio\", \"trespolo\", \"tributo\", \"tricheco\", \"trifoglio\", \"trillo\", \"trincea\", \"trio\", \"tristezza\", \"triturato\", \"trivella\", \"tromba\", \"trono\", \"troppo\", \"trottola\", \"trovare\", \"truccato\", \"tubatura\", \"tuffato\", \"tulipano\", \"tumulto\", \"tunisia\", \"turbare\", \"turchino\", \"tuta\", \"tutela\", \"ubicato\", \"uccello\", \"uccisore\", \"udire\", \"uditivo\", \"uffa\", \"ufficio\", \"uguale\", \"ulisse\", \"ultimato\", \"umano\", \"umile\", \"umorismo\", \"uncinetto\", \"ungere\", \"ungherese\", \"unicorno\", \"unificato\", \"unisono\", \"unitario\", \"unte\", \"uovo\", \"upupa\", \"uragano\", \"urgenza\", \"urlo\", \"usanza\", \"usato\", \"uscito\", \"usignolo\", \"usuraio\", \"utensile\", \"utilizzo\", \"utopia\", \"vacante\", \"vaccinato\", \"vagabondo\", \"vagliato\", \"valanga\", \"valgo\", \"valico\", \"valletta\", \"valoroso\", \"valutare\", \"valvola\", \"vampata\", \"vangare\", \"vanitoso\", \"vano\", \"vantaggio\", \"vanvera\", \"vapore\", \"varano\", \"varcato\", \"variante\", \"vasca\", \"vedetta\", \"vedova\", \"veduto\", \"vegetale\", \"veicolo\", \"velcro\", \"velina\", \"velluto\", \"veloce\", \"venato\", \"vendemmia\", \"vento\", \"verace\", \"verbale\", \"vergogna\", \"verifica\", \"vero\", \"verruca\", \"verticale\", \"vescica\", \"vessillo\", \"vestale\", \"veterano\", \"vetrina\", \"vetusto\", \"viandante\", \"vibrante\", \"vicenda\", \"vichingo\", \"vicinanza\", \"vidimare\", \"vigilia\", \"vigneto\", \"vigore\", \"vile\", \"villano\", \"vimini\", \"vincitore\", \"viola\", \"vipera\", \"virgola\", \"virologo\", \"virulento\", \"viscoso\", \"visione\", \"vispo\", \"vissuto\", \"visura\", \"vita\", \"vitello\", \"vittima\", \"vivanda\", \"vivido\", \"viziare\", \"voce\", \"voga\", \"volatile\", \"volere\", \"volpe\", \"voragine\", \"vulcano\", \"zampogna\", \"zanna\", \"zappato\", \"zattera\", \"zavorra\", \"zefiro\", \"zelante\", \"zelo\", \"zenzero\", \"zerbino\", \"zibetto\", \"zinco\", \"zircone\", \"zitto\", \"zolla\", \"zotico\", \"zucchero\", \"zufolo\", \"zulu\", \"zuppa\"]\n}\n"
  },
  {
    "path": "HDWalletKit/Models/Account.swift",
    "content": "//\n//  Account.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 04.07.18.\n//\n\nimport Foundation\n\npublic struct Account {\n    \n    public init(privateKey: PrivateKey) {\n        self.privateKey = privateKey\n    }\n    \n    public let privateKey: PrivateKey\n    \n    public var rawPrivateKey: String {\n        return privateKey.get()\n    }\n    \n    public var rawPublicKey: String {\n        return privateKey.publicKey.get()\n    }\n    \n    public var address: String {\n        return privateKey.publicKey.address\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/AccountBased/ERC20/ERC20.swift",
    "content": "//\n//  ERC20.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 24.09.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct ERC20 {\n    public let contractAddress: String\n    public let decimal: Int\n    public let symbol: String\n    \n    /// Initializer\n    ///\n    /// - Parameters:\n    ///   - contractAddress: contract address of this erc20 token\n    ///   - decimal: decimal specified in a contract\n    ///   - symbol: symbol of this erc20 token\n    public init(contractAddress: String, decimal: Int, symbol: String) {\n        self.contractAddress = contractAddress\n        self.decimal = decimal\n        self.symbol = symbol\n    }\n    \n    /// Transfer method signiture\n    /// function transfer(address _to, uint256 _value) returns (bool success)\n    var transferSignature: Data {\n        let method = \"transfer(address,uint256)\"\n        return method.data(using: .ascii)!.sha3(.keccak256)[0...3]\n    }\n    \n    var balanceSignature: Data {\n        let method = \"balanceOf(address)\"\n        return method.data(using: .ascii)!.sha3(.keccak256)[0...3]\n    }\n    \n    /// Length of 256 bits\n    private var lengthOf256bits: Int {\n        return 256 / 4\n    }\n    \n    /// Generate transaction data for ERC20 token\n    ///\n    /// - Parameter:\n    ///    - toAddress: address you are transfering to\n    ///    - amount: amount to send\n    /// - Returns: transaction data\n    public func generateSendBalanceParameter(toAddress: String, amount: String) throws -> Data {\n        let method = transferSignature.toHexString()\n        let address = pad(string: toAddress.stripHexPrefix())\n        \n        let poweredAmount = try power(amount: amount)\n        let amount = pad(string: poweredAmount.serialize().toHexString())\n        \n        return Data(hex: method + address + amount)\n    }\n    \n    /// Generate get balance data for ERC20 token\n    ///\n    /// - Parameter:\n    ///    - toAddress: address you are transfering to\n    ///    - amount: amount to send\n    /// - Returns: transaction data\n    public func generateGetBalanceParameter(toAddress: String) throws -> Data {\n        let method = balanceSignature.toHexString()\n        let address = pad(string: toAddress.stripHexPrefix())\n        return Data(hex: method + address)\n    }\n    \n    /// Power the amount by the decimal\n    ///\n    /// - Parameter:\n    ///    - amount: amount in string format\n    /// - Returns: BigInt value powered by (10 * decimal)\n    private func power(amount: String) throws -> BInt {\n        let components = amount.split(separator: \".\")\n        \n        // components.count must be 1 or 2. this method accepts only integer or decimal value\n        // like 1, 10, 100 or 1.15, 10.7777, 19.9999\n        guard components.count == 1 || components.count == 2 else {\n            throw HDWalletKitError.contractError(.containsInvalidCharactor(amount))\n        }\n        \n        guard let integer = BInt(String(components[0]), radix: 10) else {\n            throw HDWalletKitError.contractError(.containsInvalidCharactor(amount))\n        }\n        \n        let poweredInteger = integer * (BInt(10) ** decimal)\n        \n        if components.count == 2 {\n            let count = components[1].count\n            \n            guard count <= decimal else {\n                throw HDWalletKitError.contractError(.invalidDecimalValue(amount))\n            }\n            \n            guard let digit = BInt(String(components[1]), radix: 10) else {\n                throw HDWalletKitError.contractError(.containsInvalidCharactor(amount))\n            }\n            \n            let poweredDigit = digit * (BInt(10) ** (decimal - count))\n            return poweredInteger + poweredDigit\n        } else {\n            return poweredInteger\n        }\n    }\n    \n    /// Pad left spaces out of 256bits with 0\n    private func pad(string: String) -> String {\n        var string = string\n        while string.count != lengthOf256bits {\n            string = \"0\" + string\n        }\n        return string\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/AccountBased/Ethereum/Model/EthereumAddress.swift",
    "content": "//\n//  Address.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n/// Represents an address\npublic struct EthereumAddress: Codable {\n    \n    /// Address in data format\n    public let data: Data\n    \n    /// Address in string format, EIP55 encoded\n    public let string: String\n    \n    public init(data: Data, string: String) {\n        self.data = data\n        self.string = string\n    }\n    \n    public init(data: Data) {\n        self.data = data\n        self.string = \"0x\" + EIP55.encode(data)\n    }\n    \n    public init(string: String) {\n        self.data = Data(hex: string.stripHexPrefix())\n        self.string = string\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/AccountBased/Ethereum/Model/EthereumRawTransaction.swift",
    "content": "import Foundation\n/// RawTransaction constructs necessary information to publish transaction.\npublic struct EthereumRawTransaction {\n    \n    /// Amount value to send, unit is in Wei\n    public let value: Wei\n    \n    /// Address to send ether to\n    public let to: EthereumAddress\n    \n    /// Gas price for this transaction, unit is in Wei\n    /// you need to convert it if it is specified in GWei\n    /// use Converter.toWei method to convert GWei value to Wei\n    public let gasPrice: Int\n    \n    /// Gas limit for this transaction\n    /// Total amount of gas will be (gas price * gas limit)\n    public let gasLimit: Int\n    \n    /// Nonce of your address\n    public let nonce: Int\n    \n    /// Data to attach to this transaction\n    public let data: Data\n\n    public init(value: Wei, to: String, gasPrice: Int, gasLimit: Int, nonce: Int, data: Data = Data()) {\n        self.value = value\n        self.to = EthereumAddress(string:to)\n        self.gasPrice = gasPrice\n        self.gasLimit = gasLimit\n        self.nonce = nonce\n        self.data = data\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/Coin.swift",
    "content": "//\n//  Coin.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 10/3/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic enum Coin {\n    case bitcoin\n    case ethereum\n    case litecoin\n    case bitcoinCash\n    case dash\n    case dogecoin\n    \n    //https://github.com/satoshilabs/slips/blob/master/slip-0132.md\n    public var privateKeyVersion: UInt32 {\n        switch self {\n        case .litecoin:\n            return 0x019D9CFE\n        case .bitcoinCash: fallthrough\n        case .bitcoin:\n            return 0x0488ADE4\n        case .dash:\n            return 0x02FE52CC\n        case .dogecoin:\n            return 0x0488E1F4\n        default:\n            fatalError(\"Not implemented\")\n        }\n    }\n    // P2PKH\n    public var publicKeyHash: UInt8 {\n        switch self {\n        case .litecoin:\n            return 0x30\n        case .bitcoinCash: fallthrough\n        case .bitcoin:\n            return 0x00\n        case .dash:\n            return 0x4C\n        case .dogecoin:\n            return 0x1E\n        default:\n            fatalError(\"Not implemented\")\n        }\n    }\n    \n    // P2SH\n    public var scriptHash: UInt8 {\n        switch self {\n        case .bitcoinCash: fallthrough\n        case .litecoin: fallthrough\n        case .bitcoin:\n            return 0x05\n        case .dash:\n            return 0x10\n        case .dogecoin:\n            return 0x16\n        default:\n            fatalError(\"Not implemented\")\n        }\n    }\n    \n    //https://www.reddit.com/r/litecoin/comments/6vc8tc/how_do_i_convert_a_raw_private_key_to_wif_for/\n    public var wifAddressPrefix: UInt8 {\n        switch self {\n        case .dogecoin:\n            return 0x9E\n        case .bitcoinCash: fallthrough\n        case .bitcoin:\n            return 0x80\n        case .litecoin:\n            return 0xB0\n        case .dash:\n            return 0xCC\n        default:\n            fatalError(\"Not implemented\")\n        }\n    }\n    \n    public var addressPrefix:String {\n        switch self {\n        case .ethereum:\n            return \"0x\"\n        default:\n            return \"\"\n        }\n    }\n    \n    public var uncompressedPkSuffix: UInt8 {\n        return 0x01\n    }\n    \n    \n    public var coinType: UInt32 {\n        switch self {\n        case .bitcoin:\n            return 0\n        case .litecoin:\n            return 2\n        case .dash:\n            return 5\n        case .dogecoin:\n            return 3\n        case .ethereum:\n            return 60\n        case .bitcoinCash:\n            return 145\n        }\n    }\n    \n    public var scheme: String {\n        switch self {\n        case .bitcoin:\n            return \"bitcoin\"\n        case .litecoin:\n            return \"litecoin\"\n        case .bitcoinCash:\n            return \"bitcoincash\"\n        case .dogecoin:\n            return \"dogecoin\"\n        case .dash:\n            return \"dash\"\n        default: return \"\"\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/PrivateKey.swift",
    "content": "//\n//  PrivateKey.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 10/4/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nenum PrivateKeyType {\n    case hd\n    case nonHd\n}\n\npublic struct PrivateKey {\n    public let raw: Data\n    public let chainCode: Data\n    public let index: UInt32\n    public let coin: Coin\n    private var keyType: PrivateKeyType\n    \n    public init(seed: Data, coin: Coin) {\n        let output = Crypto.HMACSHA512(key: \"Bitcoin seed\".data(using: .ascii)!, data: seed)\n        self.raw = output[0..<32]\n        self.chainCode = output[32..<64]\n        self.index = 0\n        self.coin = coin\n        self.keyType = .hd\n    }\n    \n    public init?(pk: String, coin: Coin) {\n        switch coin {\n        case .ethereum:\n            self.raw = Data(hex: pk)\n        default:\n            let utxoPkType = UtxoPrivateKeyType.pkType(for: pk, coin: coin)\n            switch utxoPkType {\n            case .some(let pkType):\n                switch pkType {\n                case .hex:\n                    self.raw = Data(hex: pk)\n                case .wifUncompressed:\n                    let decodedPk = Base58.decode(pk) ?? Data()\n                    let wifData = decodedPk.dropLast(4).dropFirst()\n                    self.raw = wifData\n                case .wifCompressed:\n                    let decodedPk = Base58.decode(pk) ?? Data()\n                    let wifData = decodedPk.dropLast(4).dropFirst().dropLast()\n                    self.raw = wifData\n                }\n            case .none:\n                return nil\n            }\n\n        }\n        self.chainCode = Data(capacity: 32)\n        self.index = 0\n        self.coin = coin\n        self.keyType = .nonHd\n    }\n    \n    private init(privateKey: Data, chainCode: Data, index: UInt32, coin: Coin) {\n        self.raw = privateKey\n        self.chainCode = chainCode\n        self.index = index\n        self.coin = coin\n        self.keyType = .hd\n    }\n    \n    public var publicKey: PublicKey {\n        return PublicKey(privateKey: raw, coin: coin)\n    }\n    \n    public func wifCompressed() -> String {\n        var data = Data()\n        data += coin.wifAddressPrefix\n        data += raw\n        data += UInt8(0x01)\n        data += data.doubleSHA256.prefix(4)\n        return Base58.encode(data)\n    }\n    \n    public func wifUncompressed() -> String {\n        var data = Data()\n        data += coin.wifAddressPrefix\n        data += raw\n        data += data.doubleSHA256.prefix(4)\n        return Base58.encode(data)\n    }\n    \n    public func get() -> String {\n        switch self.coin {\n        case .bitcoin: fallthrough\n        case .litecoin: fallthrough\n        case .dash: fallthrough\n        case .bitcoinCash:\n            return self.wifCompressed()\n        case .dogecoin:\n            return self.wifUncompressed()\n        case .ethereum:\n            return self.raw.toHexString()\n        }\n    }\n    \n    public func derived(at node:DerivationNode) -> PrivateKey {\n        guard keyType == .hd else { fatalError() }\n        let edge: UInt32 = 0x80000000\n        guard (edge & node.index) == 0 else { fatalError(\"Invalid child index\") }\n        \n        var data = Data()\n        switch node {\n        case .hardened:\n            data += UInt8(0)\n            data += raw\n        case .notHardened:\n            data += Crypto.generatePublicKey(data: raw, compressed: true)\n        }\n        \n        let derivingIndex = CFSwapInt32BigToHost(node.hardens ? (edge | node.index) : node.index)\n        data += derivingIndex\n        \n        let digest = Crypto.HMACSHA512(key: chainCode, data: data)\n        let factor = BInt(data: digest[0..<32])\n        \n        let curveOrder = BInt(hex: \"FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141\")!\n        let derivedPrivateKey = ((BInt(data: raw) + factor) % curveOrder).data\n        let derivedChainCode = digest[32..<64]\n        return PrivateKey(\n            privateKey: derivedPrivateKey,\n            chainCode: derivedChainCode,\n            index: derivingIndex,\n            coin: coin\n        )\n    }\n    \n    public func sign(hash: Data) throws -> Data {\n        return try Crypto.sign(hash, privateKey: raw)\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Wallet/PublicKey.swift",
    "content": "//\n//  PublicKey.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 10/4/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\nimport CryptoSwift\nimport secp256k1\n\npublic struct PublicKey {\n    public let compressedPublicKey: Data\n    public let uncompressedPublicKey: Data\n    public let coin: Coin\n    \n    public init(privateKey: Data, coin: Coin) {\n        self.compressedPublicKey = Crypto.generatePublicKey(data: privateKey, compressed: true)\n        self.uncompressedPublicKey = Crypto.generatePublicKey(data: privateKey, compressed: false)\n        self.coin = coin\n    }\n    \n    public init(base58: Data, coin: Coin) {\n        let publickKey = Base58.encode(base58)\n        self.compressedPublicKey = Data(hex: publickKey)\n        self.uncompressedPublicKey = Data(hex: publickKey)\n        self.coin = coin\n    }\n    \n    // NOTE: https://github.com/bitcoin/bips/blob/master/bip-0013.mediawiki\n    public var address: String {\n        switch coin {\n        case .dogecoin: fallthrough\n        case .bitcoin: fallthrough\n        case .dash: fallthrough\n        case .bitcoinCash: fallthrough\n        case .litecoin:\n            return generateBtcAddress()\n        case .ethereum:\n            return generateEthAddress()\n        }\n    }\n    \n    public var utxoAddress: Address {\n        switch coin {\n        case .bitcoin, .litecoin, .dash, .bitcoinCash, .dogecoin:\n            return try! LegacyAddress(address, coin: coin)\n        case .ethereum:\n            fatalError(\"Coin does not support UTXO address\")\n        }\n    }\n    \n    func generateBtcAddress() -> String {\n        let prefix = Data([coin.publicKeyHash])\n        let payload = RIPEMD160.hash(compressedPublicKey.sha256())\n        let checksum = (prefix + payload).doubleSHA256.prefix(4)\n        return Base58.encode(prefix + payload + checksum)\n    }\n    \n    func generateCashAddress() -> String {\n        let prefix = Data([coin.publicKeyHash])\n        let payload = RIPEMD160.hash(compressedPublicKey.sha256())\n        return Bech32.encode(prefix + payload, prefix: coin.scheme)\n    }\n    \n    func generateEthAddress() -> String {\n        let formattedData = (Data(hex: coin.addressPrefix) + uncompressedPublicKey).dropFirst()\n        let addressData = Crypto.sha3keccak256(data: formattedData).suffix(20)\n        return coin.addressPrefix + EIP55.encode(addressData)\n    }\n    \n    public func get() -> String {\n        return compressedPublicKey.toHexString()\n    }\n    \n    public var data: Data {\n        return Data(hex: get())\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Bitcoin/BitcoinAddress.swift",
    "content": "//\n//  BitcoinAddress.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/8/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic enum AddressType {\n    case pubkeyHash\n    case scriptHash\n    case wif\n}\n\npublic protocol AddressProtocol {\n    var coin: Coin { get }\n    var type: AddressType { get }\n    var data: Data { get }\n    \n    var base58: String { get }\n    var cashaddr: String { get }\n}\n\npublic typealias Address = AddressProtocol\n\npublic enum AddressError: Error {\n    case invalid\n    case invalidScheme\n    case invalidVersionByte\n}\n\npublic struct LegacyAddress: Address {\n    public let coin: Coin\n    public let type: AddressType\n    public let data: Data\n    public let base58: Base58Check\n    public let cashaddr: String\n    \n    public typealias Base58Check = String\n    \n    public init(_ base58: Base58Check, coin: Coin) throws {\n        guard let raw = Base58.decode(base58) else {\n            throw AddressError.invalid\n        }\n        let checksum = raw.suffix(4)\n        let pubKeyHash = raw.dropLast(4)\n        let checksumConfirm = pubKeyHash.doubleSHA256.prefix(4)\n        guard checksum == checksumConfirm else {\n            throw AddressError.invalid\n        }\n        self.coin = coin\n        \n        let type: AddressType\n        let addressPrefix = pubKeyHash[0]\n        switch addressPrefix {\n        case coin.publicKeyHash:\n            type = .pubkeyHash\n        case coin.wifAddressPrefix:\n            type = .wif\n        case coin.scriptHash:\n            type = .scriptHash\n        default:\n            throw AddressError.invalidVersionByte\n        }\n        \n        self.type = type\n        self.data = pubKeyHash.dropFirst()\n        self.base58 = base58\n        \n        // cashaddr\n        switch type {\n        case .pubkeyHash:\n            let payload = Data([coin.publicKeyHash]) + self.data\n            self.cashaddr = Bech32.encode(payload, prefix: coin.scheme)\n        case .wif:\n            let payload = Data([coin.wifAddressPrefix]) + self.data\n            self.cashaddr = Bech32.encode(payload, prefix: coin.scheme)\n        default:\n            self.cashaddr = \"\"\n        }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Bitcoin/BitcoinTransactionSignatureSerializer.swift",
    "content": "//\n//  BitcoinTransactionSignatureSerializer.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/5/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct BitcoinTransactionSignatureSerializer {\n    var tx: Transaction\n    var utxo: TransactionOutput\n    var inputIndex: Int\n    var hashType: SighashType\n    \n    // input should be modified before sign\n    internal func modifiedInput(for i: Int) -> TransactionInput {\n        let txin = tx.inputs[i]\n        let sigScript: Data\n        let sequence: UInt32\n        \n        if i == inputIndex {\n            let subScript = Script(data: utxo.lockingScript)\n            try! subScript?.deleteOccurrences(of: .OP_CODESEPARATOR)\n            sigScript = subScript?.data ?? Data()\n            sequence = txin.sequence\n        } else if hashType.isNone || hashType.isSingle {\n            // If hashtype is NONE or SINGLE, blank out others' input sequence numbers to let others update transaction at will.\n            sigScript = Data()\n            sequence = 0\n        } else {\n            sigScript = Data()\n            sequence = txin.sequence\n        }\n        return TransactionInput(previousOutput: txin.previousOutput, signatureScript: sigScript, sequence: sequence)\n    }\n    \n    public func serialize() -> Data {\n        let inputsToSerialize: [TransactionInput]\n        let outputsToSerialize: [TransactionOutput]\n        // In case of SIGHASH_ANYONECANPAY, only the input being signed is serialized\n        if hashType.isAnyoneCanPay {\n            inputsToSerialize = [modifiedInput(for: inputIndex)]\n        } else {\n            inputsToSerialize = (0..<tx.inputs.count).map { modifiedInput(for: $0) }\n        }\n        \n        if hashType.isNone {\n            // Wildcard payee - we can pay anywhere.\n            outputsToSerialize = []\n        } else if hashType.isSingle {\n            // Single mode assumes we sign an output at the same index as an input.\n            // All outputs before the one we need are blanked out. All outputs after are simply removed.\n            // Only lock-in the txout payee at same index as txin.\n            // This is equivalent to replacing outputs with (i-1) empty outputs and a i-th original one.\n            let myOutput = tx.outputs[inputIndex]\n            outputsToSerialize = Array(repeating: TransactionOutput(), count: inputIndex) + [myOutput]\n        } else {\n            outputsToSerialize = tx.outputs\n        }\n        \n        let tmp = Transaction(version: tx.version,\n                              inputs: inputsToSerialize,\n                              outputs: outputsToSerialize,\n                              lockTime: tx.lockTime)\n        return tmp.serialized()\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Bitcoin/Transaction+SignatureHash.swift",
    "content": "//\n//  Transaction+SignatureHash.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/5/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nprivate let zero: Data = Data(repeating: 0, count: 32)\nprivate let one: Data = Data(repeating: 1, count: 1) + Data(repeating: 0, count: 31)\n\nextension Transaction {\n    internal func getPrevoutHash(hashType: SighashType) -> Data {\n        if !hashType.isAnyoneCanPay {\n            // If the ANYONECANPAY flag is not set, hashPrevouts is the double SHA256 of the serialization of all input outpoints\n            let serializedPrevouts: Data = inputs.reduce(Data()) { $0 + $1.previousOutput.serialized() }\n            return serializedPrevouts.doubleSHA256\n        } else {\n            // if ANYONECANPAY then uint256 of 0x0000......0000.\n            return zero\n        }\n    }\n    \n    internal func getSequenceHash(hashType: SighashType) -> Data {\n        if !hashType.isAnyoneCanPay\n            && !hashType.isSingle\n            && !hashType.isNone {\n            // If none of the ANYONECANPAY, SINGLE, NONE sighash type is set, hashSequence is the double SHA256 of the serialization of nSequence of all inputs\n            let serializedSequence: Data = inputs.reduce(Data()) { $0 + $1.sequence }\n            return serializedSequence.doubleSHA256\n        } else {\n            // Otherwise, hashSequence is a uint256 of 0x0000......0000\n            return zero\n        }\n    }\n    \n    internal func getOutputsHash(index: Int, hashType: SighashType) -> Data {\n        if !hashType.isSingle\n            && !hashType.isNone {\n            // If the sighash type is neither SINGLE nor NONE, hashOutputs is the double SHA256 of the serialization of all output amounts (8-byte little endian) paired up with their scriptPubKey (serialized as scripts inside CTxOuts)\n            let serializedOutputs: Data = outputs.reduce(Data()) { $0 + $1.serialized() }\n            return serializedOutputs.doubleSHA256\n        } else if hashType.isSingle && index < outputs.count {\n            // If sighash type is SINGLE and the input index is smaller than the number of outputs, hashOutputs is the double SHA256 of the output amount with scriptPubKey of the same index as the input\n            let serializedOutput = outputs[index].serialized()\n            return serializedOutput.doubleSHA256\n        } else {\n            // Otherwise, hashOutputs is a uint256 of 0x0000......0000.\n            return zero\n        }\n    }\n    \n    internal func signatureHashLegacy(for utxo: TransactionOutput, inputIndex: Int, hashType: SighashType) -> Data {\n        // If inputIndex is out of bounds, BitcoinABC is returning a 256-bit little-endian 0x01 instead of failing with error.\n        guard inputIndex < inputs.count else {\n            //  tx.inputs[inputIndex] out of range\n            return one\n        }\n        \n        // Check for invalid use of SIGHASH_SINGLE\n        guard !(hashType.isSingle && inputIndex < outputs.count) else {\n            //  tx.outputs[inputIndex] out of range\n            return one\n        }\n        \n        // Transaction is struct(value type), so it's ok to use self as an arg\n        let txSigSerializer = BitcoinTransactionSignatureSerializer(tx: self, utxo: utxo, inputIndex: inputIndex, hashType: hashType)\n        var data: Data = txSigSerializer.serialize()\n        data += UInt32(hashType)\n        let hash = data.doubleSHA256\n        return hash\n    }\n    \n    public func signatureHash(for utxo: TransactionOutput, inputIndex: Int, hashType: SighashType) -> Data {\n        // If hashType doesn't have a fork id, use legacy signature hash\n        guard hashType.hasForkId else {\n            return signatureHashLegacy(for: utxo, inputIndex: inputIndex, hashType: hashType)\n        }\n        \n        // \"txin\" ≒ \"utxo\"\n        // \"txin\" is an input of this tx\n        // \"utxo\" is an output of the prev tx\n        // Currently not handling \"inputIndex is out of range error\" because BitcoinABC implementation is not handling this.\n        let txin = inputs[inputIndex]\n        \n        var data = Data()\n        // 1. nVersion (4-byte)\n        data += version\n        // 2. hashPrevouts\n        data += getPrevoutHash(hashType: hashType)\n        // 3. hashSequence\n        data += getSequenceHash(hashType: hashType)\n        // 4. outpoint [of the input txin]\n        data += txin.previousOutput.serialized()\n        // 5. scriptCode [of the input txout]\n        data += utxo.scriptCode()\n        // 6. value [of the input txout] (8-byte)\n        data += utxo.value\n        // 7. nSequence [of the input txin] (4-byte)\n        data += txin.sequence\n        // 8. hashOutputs\n        data += getOutputsHash(index: inputIndex, hashType: hashType)\n        // 9. nLocktime (4-byte)\n        data += lockTime\n        // 10. Sighash types [This time input] (4-byte)\n        data += UInt32(hashType)\n        let hash = data.doubleSHA256\n        return hash\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/BitcoinCash/BitcoinCashAddress.swift",
    "content": "//\n//  BitcoinCashAddress.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 5/1/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct BitcoinCashAddress: Address {\n    public let coin: Coin\n    public let type: AddressType\n    public let data: Data\n    public let base58: String\n    public let cashaddr: String\n    \n    public init(_ cashaddr: String) throws {\n        guard let decoded = Bech32.decode(cashaddr) else {\n            throw AddressError.invalid\n        }\n        \n        let raw = decoded.data\n        self.cashaddr = cashaddr\n        self.coin = .bitcoinCash\n        \n        let versionByte = raw[0]\n        let hash = raw.dropFirst()\n        \n        guard hash.count == BitcoinCashVersionByte.getSize(from: versionByte) else {\n            throw AddressError.invalidVersionByte\n        }\n        self.data = hash\n        guard let typeBits = BitcoinCashVersionByte.TypeBits(rawValue: (versionByte & 0b01111000)) else {\n            throw AddressError.invalidVersionByte\n        }\n        \n        switch typeBits {\n        case .pubkeyHash:\n            type = .pubkeyHash\n            base58 = publicKeyHashToAddress(Data([coin.publicKeyHash]) + data)\n        case .scriptHash:\n            type = .scriptHash\n            base58 = publicKeyHashToAddress(Data([coin.scriptHash]) + data)\n        }\n    }\n}\nfunc publicKeyHashToAddress(_ hash: Data) -> String {\n    let checksum =  hash.doubleSHA256.prefix(4)\n    let address = Base58.encode(hash + checksum)\n    return address\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/BitcoinCash/BitcoinCashVersionByte.swift",
    "content": "//\n//  BitcoinCashVersionByte.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/8/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic class BitcoinCashVersionByte {\n    static let pubkeyHash160: UInt8 = PubkeyHash160().bytes\n    static let scriptHash160: UInt8 = ScriptHash160().bytes\n    var bytes: UInt8 {\n        return type.rawValue + size.rawValue\n    }\n    \n    public var type: TypeBits { return .pubkeyHash }\n    public var size: SizeBits { return .size160 }\n    \n    public static func getSize(from versionByte: UInt8) -> Int {\n        guard let sizeBits = SizeBits(rawValue: versionByte & 0x07) else {\n            return 0\n        }\n        switch sizeBits {\n        case .size160:\n            return 20\n        case .size192:\n            return 24\n        case .size224:\n            return 28\n        case .size256:\n            return 32\n        case .size320:\n            return 40\n        case .size384:\n            return 48\n        case .size448:\n            return 56\n        case .size512:\n            return 64\n        }\n    }\n    \n    // First 1 bit is zero\n    // Next 4bits\n    public enum TypeBits: UInt8 {\n        case pubkeyHash = 0\n        case scriptHash = 8\n    }\n    \n    // The least 3bits\n    public enum SizeBits: UInt8 {\n        case size160 = 0\n        case size192 = 1\n        case size224 = 2\n        case size256 = 3\n        case size320 = 4\n        case size384 = 5\n        case size448 = 6\n        case size512 = 7\n    }\n}\n\npublic class PubkeyHash160: BitcoinCashVersionByte {\n    public override var size: SizeBits { return .size160 }\n    public override var type: TypeBits { return .pubkeyHash }\n}\npublic class ScriptHash160: BitcoinCashVersionByte {\n    public override var size: SizeBits { return .size160 }\n    public override var type: TypeBits { return .scriptHash }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Constants/SighashType.swift",
    "content": "//\n//  SighashType.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/7/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nprivate let SIGHASH_ALL: UInt8 = 0x01 // 00000001\nprivate let SIGHASH_NONE: UInt8 = 0x02 // 00000010\nprivate let SIGHASH_SINGLE: UInt8 = 0x03 // 00000011\nprivate let SIGHASH_FORK_ID: UInt8 = 0x40 // 01000000\nprivate let SIGHASH_ANYONECANPAY: UInt8 = 0x80 // 10000000\n\nprivate let SIGHASH_OUTPUT_MASK: UInt8 = 0x1f // 00011111\n\npublic struct SighashType {\n    fileprivate let uint8: UInt8\n    init(_ uint8: UInt8) {\n        self.uint8 = uint8\n    }\n    \n    private var outputType: UInt8 {\n        return self.uint8 & SIGHASH_OUTPUT_MASK\n    }\n    public var isAll: Bool {\n        return outputType == SIGHASH_ALL\n    }\n    public var isSingle: Bool {\n        return outputType == SIGHASH_SINGLE\n    }\n    public var isNone: Bool {\n        return outputType == SIGHASH_NONE\n    }\n    \n    public var hasForkId: Bool {\n        return (self.uint8 & SIGHASH_FORK_ID) != 0\n    }\n    public var isAnyoneCanPay: Bool {\n        return (self.uint8 & SIGHASH_ANYONECANPAY) != 0\n    }\n    \n    public struct BCH {\n        public static let ALL: SighashType = SighashType(SIGHASH_FORK_ID + SIGHASH_ALL) // 01000001\n        public static let NONE: SighashType = SighashType(SIGHASH_FORK_ID + SIGHASH_NONE) // 01000010\n        public static let SINGLE: SighashType = SighashType(SIGHASH_FORK_ID + SIGHASH_SINGLE) // 01000011\n        public static let ALL_ANYONECANPAY: SighashType = SighashType(SIGHASH_FORK_ID + SIGHASH_ALL + SIGHASH_ANYONECANPAY) // 11000001\n        public static let NONE_ANYONECANPAY: SighashType = SighashType(SIGHASH_FORK_ID + SIGHASH_NONE + SIGHASH_ANYONECANPAY) // 11000010\n        public static let SINGLE_ANYONECANPAY: SighashType = SighashType(SIGHASH_FORK_ID + SIGHASH_SINGLE + SIGHASH_ANYONECANPAY) // 11000011\n    }\n    \n    public struct BTC {\n        public static let ALL: SighashType = SighashType(SIGHASH_ALL) // 00000001\n        public static let NONE: SighashType = SighashType(SIGHASH_NONE) // 00000010\n        public static let SINGLE: SighashType = SighashType(SIGHASH_SINGLE) // 00000011\n        public static let ALL_ANYONECANPAY: SighashType = SighashType(SIGHASH_ALL + SIGHASH_ANYONECANPAY) // 10000001\n        public static let NONE_ANYONECANPAY: SighashType = SighashType(SIGHASH_NONE + SIGHASH_ANYONECANPAY) // 10000010\n        public static let SINGLE_ANYONECANPAY: SighashType = SighashType(SIGHASH_SINGLE + SIGHASH_ANYONECANPAY) // 10000011\n    }\n    \n    static func hashTypeForCoin(coin: Coin) -> SighashType {\n        switch coin {\n        case .bitcoinCash:\n            return BCH.ALL\n        default:\n            return BTC.ALL\n        }\n    }\n}\n\nextension UInt8 {\n    public init(_ hashType: SighashType) {\n        self = hashType.uint8\n    }\n}\n\nextension UInt32 {\n    public init(_ hashType: SighashType) {\n        self = UInt32(UInt8(hashType))\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Constants/UtilsAndLimits.swift",
    "content": "//\n//  UtilsAndLimits.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/6/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\n// P2SH BIP16 didn't become active until Apr 1 2012. All txs before this timestamp should not be verified with P2SH rule.\nlet BTC_BIP16_TIMESTAMP: UInt32 = 1_333_238_400\n\n// Scripts longer than 10000 bytes are invalid.\nlet BTC_MAX_SCRIPT_SIZE: Int = 10_000\n\n// Maximum number of bytes per \"pushdata\" operation\nlet BTC_MAX_SCRIPT_ELEMENT_SIZE: Int = 520; // bytes\n\n// Number of public keys allowed for OP_CHECKMULTISIG\nlet BTC_MAX_KEYS_FOR_CHECKMULTISIG: Int = 20\n\n// Maximum number of operations allowed per script (excluding pushdata operations and OP_<N>)\n// Multisig op additionally increases count by a number of pubkeys.\nlet BTC_MAX_OPS_PER_SCRIPT: Int = 201\n\nlet BTC_LOCKTIME_THRESHOLD: UInt32 = 500_000_000\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Default/UtxoSelector.swift",
    "content": "//\n//  UtxoSelector.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/12/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic class UtxoSelector: UtxoSelectorInterface {\n    public let feePerByte: UInt64\n    public let dustThreshhold: UInt64\n    \n    public init(feePerByte: UInt64 = 1, dustThreshhold: UInt64 = 3 * 182) {\n        self.feePerByte = feePerByte\n        self.dustThreshhold = dustThreshhold\n    }\n    \n    public func select(from utxos: [UnspentTransaction], targetValue: UInt64) throws -> (utxos: [UnspentTransaction], fee: UInt64) {\n        // if target value is zero, fee is zero\n        guard targetValue > 0 else {\n            return ([], 0)\n        }\n        \n        // definitions for the following caluculation\n        let doubleTargetValue = targetValue * 2\n        var numOutputs = 2 // if allow multiple output, it will be changed.\n        var numInputs = 2\n        var fee: UInt64 {\n            return calculateFee(nIn: numInputs, nOut: numOutputs)\n        }\n        var targetWithFee: UInt64 {\n            return targetValue + fee\n        }\n        var targetWithFeeAndDust: UInt64 {\n            return targetWithFee + dustThreshhold\n        }\n        \n        let sortedUtxos: [UnspentTransaction] = utxos.sorted(by: { $0.output.value < $1.output.value })\n        \n        // total values of utxos should be greater than targetValue\n        guard sortedUtxos.sum() >= targetValue && !sortedUtxos.isEmpty else {\n            throw UtxoSelectError.insufficientFunds\n        }\n        \n        // difference from 2x targetValue\n        func distFrom2x(_ val: UInt64) -> UInt64 {\n            if val > doubleTargetValue { return val - doubleTargetValue } else { return doubleTargetValue - val }\n        }\n        \n        // 1. Find a combination of the fewest outputs that is\n        //    (1) bigger than what we need\n        //    (2) closer to 2x the amount,\n        //    (3) and does not produce dust change.\n        txN:do {\n            for numTx in (1...sortedUtxos.count) {\n                numInputs = numTx\n                let nOutputsSlices = sortedUtxos.eachSlices(numInputs)\n                var nOutputsInRange = nOutputsSlices.filter { $0.sum() >= targetWithFeeAndDust }\n                nOutputsInRange.sort { distFrom2x($0.sum()) < distFrom2x($1.sum()) }\n                if let nOutputs = nOutputsInRange.first {\n                    return (nOutputs, fee)\n                }\n            }\n        }\n        \n        // 2. If not, find a combination of outputs that may produce dust change.\n        txDiscardDust:do {\n            for numTx in (1...sortedUtxos.count) {\n                numInputs = numTx\n                let nOutputsSlices = sortedUtxos.eachSlices(numInputs)\n                let nOutputsInRange = nOutputsSlices.filter {\n                    return $0.sum() >= targetWithFee\n                }\n                if let nOutputs = nOutputsInRange.first {\n                    return (nOutputs, fee)\n                }\n            }\n        }\n        \n        throw UtxoSelectError.insufficientFunds\n    }\n    \n    private func calculateFee(nIn: Int, nOut: Int = 2) -> UInt64 {\n        var txsize: Int {\n            return ((148 * nIn) + (34 * nOut) + 10)\n        }\n        return UInt64(txsize) * feePerByte\n    }\n}\n\nenum UtxoSelectError: Error {\n    case insufficientFunds\n    case error(String)\n}\n\nprivate extension Array {\n    // Slice Array\n    // [0,1,2,3,4,5,6,7,8,9].eachSlices(3)\n    // >\n    // [[0, 1, 2], [1, 2, 3], [2, 3, 4], [3, 4, 5], [4, 5, 6], [5, 6, 7], [6, 7, 8], [7, 8, 9]]\n    func eachSlices(_ num: Int) -> [[Element]] {\n        let slices = (0...count - num).map { self[$0..<$0 + num].map { $0 } }\n        return slices\n    }\n}\n\ninternal extension Sequence where Element == UnspentTransaction {\n    func sum() -> UInt64 {\n        return reduce(UInt64()) { $0 + $1.output.value }\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Default/UtxoTransactionBuilder.swift",
    "content": "//\n//  UtxoTransactionBuilder.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/17/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct UtxoTransactionBuilder: UtxoTransactionBuilderInterface {\n    public init() {}\n    public func build(destinations: [(address: Address, amount: UInt64)], utxos: [UnspentTransaction]) throws -> UnsignedTransaction {\n        let outputs = try destinations.map { (address: Address, amount: UInt64) -> TransactionOutput in\n            guard let lockingScript = Script(address: address)?.data else {\n                throw TransactionBuildError.error(\"Invalid address type\")\n            }\n            return TransactionOutput(value: amount, lockingScript: lockingScript)\n        }\n        \n        let unsignedInputs = utxos.map { TransactionInput(previousOutput: $0.outpoint, signatureScript: $0.output.lockingScript, sequence: UInt32.max) }\n        let tx = Transaction(version: 1, inputs: unsignedInputs, outputs: outputs, lockTime: 0)\n        return UnsignedTransaction(tx: tx, utxos: utxos)\n    }\n}\n\nenum TransactionBuildError: Error {\n    case error(String)\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Default/UtxoTransactionSigner.swift",
    "content": "//\n//  UtxoTransactionSigner.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/19/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct UtxoTransactionSigner: UtxoTransactionSignerInterface {\n    public init() {}\n    \n    public func sign(_ unsignedTransaction: UnsignedTransaction, with key: PrivateKey) throws -> Transaction {\n        // Define Transaction\n        var signingInputs: [TransactionInput]\n        var signingTransaction: Transaction {\n            let tx: Transaction = unsignedTransaction.tx\n            return Transaction(version: tx.version, inputs: signingInputs, outputs: tx.outputs, lockTime: tx.lockTime)\n        }\n        \n        // Sign\n        signingInputs = unsignedTransaction.tx.inputs\n        let hashType = SighashType.hashTypeForCoin(coin: key.coin)\n        for (i, utxo) in unsignedTransaction.utxos.enumerated() {\n            // Sign transaction hash\n            let sighash: Data = signingTransaction.signatureHash(for: utxo.output, inputIndex: i, hashType: hashType)\n            let signature: Data = try ECDSA.sign(sighash, privateKey: key.raw)\n            let txin = signingInputs[i]\n            let pubkey = key.publicKey\n            \n            // Create Signature Script\n            let sigWithHashType: Data = signature + UInt8(hashType)\n            let unlockingScript: Script = try Script()\n                .appendData(sigWithHashType)\n                .appendData(pubkey.data)\n            \n            // Update TransactionInput\n            signingInputs[i] = TransactionInput(previousOutput: txin.previousOutput, signatureScript: unlockingScript.data, sequence: txin.sequence)\n        }\n        return signingTransaction\n        \n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Model/TransactionInput.swift",
    "content": "//\n//  BitcoinTransactionInput.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/7/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct TransactionInput {\n    /// The previous output transaction reference, as an OutPoint structure\n    public let previousOutput: TransactionOutPoint\n    /// The length of the signature script\n    public var scriptLength: VarInt {\n        return VarInt(signatureScript.count)\n    }\n    /// Computational Script for confirming transaction authorization\n    public let signatureScript: Data\n    /// Transaction version as defined by the sender. Intended for \"replacement\" of transactions when information is updated before inclusion into a block.\n    public let sequence: UInt32\n    \n    public init(previousOutput: TransactionOutPoint, signatureScript: Data, sequence: UInt32) {\n        self.previousOutput = previousOutput\n        self.signatureScript = signatureScript\n        self.sequence = sequence\n    }\n    \n    public func isCoinbase() -> Bool {\n        return previousOutput.hash == Data(count: 32)\n            && previousOutput.index == 0xFFFF_FFFF\n    }\n    \n    public func serialized() -> Data {\n        var data = Data()\n        data += previousOutput.serialized()\n        data += scriptLength.serialized()\n        data += signatureScript\n        data += sequence\n        return data\n    }\n    \n    static func deserialize(_ byteStream: ByteStream) -> TransactionInput {\n        let previousOutput = TransactionOutPoint.deserialize(byteStream)\n        let scriptLength = byteStream.read(VarInt.self)\n        let signatureScript = byteStream.read(Data.self, count: Int(scriptLength.underlyingValue))\n        let sequence = byteStream.read(UInt32.self)\n        return TransactionInput(previousOutput: previousOutput, signatureScript: signatureScript, sequence: sequence)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Model/UnsignedTransaction.swift",
    "content": "//\n//  UnsignedTransaction.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/17/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct UnsignedTransaction {\n    public let tx: Transaction\n    public let utxos: [UnspentTransaction]\n    \n    public init(tx: Transaction, utxos: [UnspentTransaction]) {\n        self.tx = tx\n        self.utxos = utxos\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Model/UnspendTransaction/TransactionOutPoint.swift",
    "content": "//\n//  BitcoinTransactionOutPoint.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12/28/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\nimport CryptoSwift\n\npublic struct TransactionOutPoint {\n    /// The hash of the referenced transaction.\n    public let hash: Data\n    /// The index of the specific output in the transaction. The first output is 0, etc.\n    public let index: UInt32\n    \n    public init(hash: Data, index: UInt32) {\n        self.hash = hash\n        self.index = index\n    }\n    \n    public func serialized() -> Data {\n        var data = Data()\n        data += hash\n        data += index\n        return data\n    }\n    \n    static func deserialize(_ byteStream: ByteStream) -> TransactionOutPoint {\n        let hash = Data(byteStream.read(Data.self, count: 32))\n        let index = byteStream.read(UInt32.self)\n        return TransactionOutPoint(hash: hash, index: index)\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Model/UnspendTransaction/TransactionOutput.swift",
    "content": "//\n//  BitcoinTransactionOutput.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12/28/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct TransactionOutput {\n    /// Transaction Value\n    public let value: UInt64\n    /// Length of the pk_script\n    public var scriptLength: VarInt {\n        return VarInt(lockingScript.count)\n    }\n    /// Usually contains the public key as a Bitcoin script setting up conditions to claim this output\n    public let lockingScript: Data\n    \n    public func scriptCode() -> Data {\n        var data = Data()\n        data += scriptLength.serialized()\n        data += lockingScript\n        return data\n    }\n    \n    public init(value: UInt64, lockingScript: Data) {\n        self.value = value\n        self.lockingScript = lockingScript\n    }\n    \n    public init() {\n        self.init(value: 0, lockingScript: Data())\n    }\n    \n    public func serialized() -> Data {\n        var data = Data()\n        data += value\n        data += scriptLength.serialized()\n        data += lockingScript\n        return data\n    }\n    \n    static func deserialize(_ byteStream: ByteStream) -> TransactionOutput {\n        let value = byteStream.read(UInt64.self)\n        let scriptLength = byteStream.read(VarInt.self)\n        let lockingScript = byteStream.read(Data.self, count: Int(scriptLength.underlyingValue))\n        return TransactionOutput(value: value, lockingScript: lockingScript)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Model/UnspendTransaction/UnspendTransaction.swift",
    "content": "//\n//  UnspendTransaction.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 12/28/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic struct UnspentTransaction {\n    public let output: TransactionOutput\n    public let outpoint: TransactionOutPoint\n    \n    public init(output: TransactionOutput, outpoint: TransactionOutPoint) {\n        self.output = output\n        self.outpoint = outpoint\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Protocols/UtxoSelectorInterface.swift",
    "content": "//\n//  UTXOSelector.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/19/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol UtxoSelectorInterface {\n    func select(from utxos: [UnspentTransaction], targetValue: UInt64) throws -> (utxos: [UnspentTransaction], fee: UInt64)\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Protocols/UtxoTransactionBuilderInterface.swift",
    "content": "//\n//  UtxoTransactionBuilder.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/19/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol UtxoTransactionBuilderInterface {\n    func build(destinations: [(address: Address, amount: UInt64)], utxos: [UnspentTransaction]) throws -> UnsignedTransaction\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Protocols/UtxoTransactionSignerInterface.swift",
    "content": "//\n//  UtxoTransactionSigner.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/19/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic protocol UtxoTransactionSignerInterface {\n    func sign(_ unsignedTransaction: UnsignedTransaction, with key: PrivateKey) throws -> Transaction\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/Transaction.swift",
    "content": "//\n//  BitcoinTransaction.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 1/8/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\n/// tx describes a bitcoin transaction, in reply to getdata\npublic struct Transaction {\n    /// Transaction data format version (note, this is signed)\n    public let version: UInt32\n    /// If present, always 0001, and indicates the presence of witness data\n    // public let flag: UInt16 // If present, always 0001, and indicates the presence of witness data\n    /// Number of Transaction inputs (never zero)\n    public var txInCount: VarInt {\n        return VarInt(inputs.count)\n    }\n    /// A list of 1 or more transaction inputs or sources for coins\n    public let inputs: [TransactionInput]\n    /// Number of Transaction outputs\n    public var txOutCount: VarInt {\n        return VarInt(outputs.count)\n    }\n    /// A list of 1 or more transaction outputs or destinations for coins\n    public let outputs: [TransactionOutput]\n    /// A list of witnesses, one for each input; omitted if flag is omitted above\n    // public let witnesses: [TransactionWitness] // A list of witnesses, one for each input; omitted if flag is omitted above\n    /// The block number or timestamp at which this transaction is unlocked:\n    public let lockTime: UInt32\n    \n    public var txHash: Data {\n        return serialized().doubleSHA256\n    }\n    \n    public var txID: String {\n        return Data(txHash.reversed()).hex\n    }\n    \n    public init(version: UInt32, inputs: [TransactionInput], outputs: [TransactionOutput], lockTime: UInt32) {\n        self.version = version\n        self.inputs = inputs\n        self.outputs = outputs\n        self.lockTime = lockTime\n    }\n    \n    public func serialized() -> Data {\n        var data = Data()\n        data += version\n        data += txInCount.serialized()\n        data += inputs.flatMap { $0.serialized() }\n        data += txOutCount.serialized()\n        data += outputs.flatMap { $0.serialized() }\n        data += lockTime\n        return data\n    }\n    \n    public func isCoinbase() -> Bool {\n        return inputs.count == 1 && inputs[0].isCoinbase()\n    }\n    \n    public static func deserialize(_ data: Data) -> Transaction {\n        let byteStream = ByteStream(data)\n        return deserialize(byteStream)\n    }\n    \n    static func deserialize(_ byteStream: ByteStream) -> Transaction {\n        let version = byteStream.read(UInt32.self)\n        let txInCount = byteStream.read(VarInt.self)\n        var inputs = [TransactionInput]()\n        for _ in 0..<Int(txInCount.underlyingValue) {\n            inputs.append(TransactionInput.deserialize(byteStream))\n        }\n        let txOutCount = byteStream.read(VarInt.self)\n        var outputs = [TransactionOutput]()\n        for _ in 0..<Int(txOutCount.underlyingValue) {\n            outputs.append(TransactionOutput.deserialize(byteStream))\n        }\n        let lockTime = byteStream.read(UInt32.self)\n        return Transaction(version: version, inputs: inputs, outputs: outputs, lockTime: lockTime)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/UTXOWallet.swift",
    "content": "//\n//  UTXOWallet.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 2/19/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\nfinal public class UTXOWallet {\n    public let privateKey: PrivateKey\n    \n    private let utxoSelector: UtxoSelectorInterface\n    private let utxoTransactionBuilder: UtxoTransactionBuilderInterface\n    private let utoxTransactionSigner: UtxoTransactionSignerInterface\n    \n    public convenience init(privateKey: PrivateKey) {\n        switch privateKey.coin {\n        case .bitcoin, .litecoin, .dash, .bitcoinCash:\n            self.init(privateKey: privateKey,\n                      utxoSelector: UtxoSelector(),\n                      utxoTransactionBuilder: UtxoTransactionBuilder(),\n                      utoxTransactionSigner: UtxoTransactionSigner())\n        default:\n            fatalError(\"Coin not supported yet\")\n        }\n    }\n    \n    public init(privateKey: PrivateKey,\n                utxoSelector: UtxoSelectorInterface,\n                utxoTransactionBuilder: UtxoTransactionBuilderInterface,\n                utoxTransactionSigner: UtxoTransactionSignerInterface) {\n        self.privateKey = privateKey\n        self.utxoSelector = utxoSelector\n        self.utxoTransactionBuilder = utxoTransactionBuilder\n        self.utoxTransactionSigner = utoxTransactionSigner\n    }\n    \n    public func createTransaction(to toAddress: Address, amount: UInt64, utxos: [UnspentTransaction]) throws -> String {\n        let (utxosToSpend, fee) = try self.utxoSelector.select(from: utxos, targetValue: amount)\n        let totalAmount: UInt64 = utxosToSpend.sum()\n        let change: UInt64 = totalAmount - amount - fee\n        let destinations: [(Address, UInt64)] = [(toAddress, amount), (privateKey.publicKey.utxoAddress, change)]\n        let unsignedTx = try self.utxoTransactionBuilder.build(destinations: destinations, utxos: utxosToSpend)\n        let signedTx = try self.utoxTransactionSigner.sign(unsignedTx, with: self.privateKey)\n        return signedTx.serialized().hex\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/UTXOBased/UtxoPrivateKeyType.swift",
    "content": "//\n//  UtxoPrivateKeyType.swift\n//  HDWalletKit\n//\n//  Created by Pavlo Boiko on 4/17/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport Foundation\n\npublic enum UtxoPrivateKeyType {\n    case wifUncompressed\n    case wifCompressed\n    case hex\n    \n    private func regexForCoin(coin: Coin) -> String {\n        switch coin {\n        case .bitcoin:\n            switch self {\n            case .hex:\n                return \"^\\\\p{XDigit}+$\"\n            case .wifCompressed:\n                return \"[KL][1-9A-HJ-NP-Za-km-z]{51}\"\n            case .wifUncompressed:\n                return \"^5[HJK][0-9A-Za-z&&[^0OIl]]{49}\"\n            }\n        case .litecoin:\n            switch self {\n            case .hex:\n                return \"^\\\\p{XDigit}+$\"\n            case .wifCompressed:\n                return \"[T][1-9A-HJ-NP-Za-km-z]{51}\"\n            case .wifUncompressed:\n                return \"^6[uv][1-9A-HJ-NP-Za-km-z]{49}\"\n            }\n        case .ethereum:\n            return \"^\\\\p{XDigit}+$\"\n        case .bitcoinCash:\n            switch self {\n            case .hex:\n                return \"^\\\\p{XDigit}+$\"\n            case .wifCompressed:\n                return \"[KL][1-9A-HJ-NP-Za-km-z]{51}\"\n            case .wifUncompressed:\n                return \"^5[HJK][0-9A-Za-z&&[^0OIl]]{49}\"\n            }\n        case .dash:\n            switch self {\n            case .hex:\n                return \"^\\\\p{XDigit}+$\"\n            case .wifCompressed:\n                return \"[X][1-9A-HJ-NP-Za-km-z]{51}\"\n            case .wifUncompressed:\n                return \"^7[rs][1-9A-HJ-NP-Za-km-z]{49}\"\n            }\n        case .dogecoin:\n            switch self {\n            case .hex:\n                return \"^\\\\p{XDigit}+$\"\n            case .wifCompressed:\n                return \"[Q][1-9A-HJ-NP-Za-km-z]{51}\"\n            case .wifUncompressed:\n                return \"^6[LKJ][1-9A-HJ-NP-Za-km-z]{49}\"\n            }\n        }\n    }\n    \n    static func pkType(for pk: String, coin: Coin) -> UtxoPrivateKeyType? {\n        let range = NSRange(location: 0, length: pk.utf16.count)\n        return [UtxoPrivateKeyType.wifUncompressed, .wifCompressed, .hex].first(where: {\n            let regexString = $0.regexForCoin(coin: coin)\n            let regex = try? NSRegularExpression(pattern: regexString, options: [])\n            return regex?.matches(in: pk, options: [], range: range).count == 1\n        })\n    }\n}\n"
  },
  {
    "path": "HDWalletKit/Wallet/Wallet.swift",
    "content": "//\n//  Wallet.swift\n//  WalletKit\n//\n//  Created by yuzushioh on 2018/01/01.\n//  Copyright © 2018 yuzushioh. All rights reserved.\n//\nimport Foundation\n\npublic final class Wallet {\n    \n    public let privateKey: PrivateKey\n    public let coin: Coin\n    \n    public init(seed: Data, coin: Coin) {\n        self.coin = coin\n        privateKey = PrivateKey(seed: seed, coin: coin)\n    }\n    \n    //MARK: - Public\n    public func generateAddress(at index: UInt32)  -> String {\n        let derivedKey = bip44PrivateKey.derived(at: .notHardened(index))\n        return derivedKey.publicKey.address\n    }\n    \n    public func generateAccount(at derivationPath: [DerivationNode]) -> Account {\n        let privateKey = generatePrivateKey(at: derivationPath)\n        return Account(privateKey: privateKey)\n    }\n    \n    public func generateAccount(at index: UInt32 = 0) -> Account {\n        let address = bip44PrivateKey.derived(at: .notHardened(index))\n        return Account(privateKey: address)\n    }\n    \n    public func generateAccounts(count: UInt32) -> [Account]  {\n        var accounts:[Account] = []\n        for index in 0..<count {\n            accounts.append(generateAccount(at: index))\n        }\n        return accounts\n    }\n    \n    public func sign(rawTransaction: EthereumRawTransaction) throws -> String {\n        let signer = EIP155Signer(chainId: 1)\n        let rawData = try signer.sign(rawTransaction, privateKey: privateKey)\n        let hash = rawData.toHexString().addHexPrefix()\n        return hash\n    }\n    \n    //MARK: - Private\n    //https://github.com/bitcoin/bips/blob/master/bip-0044.mediawiki\n    private var bip44PrivateKey:PrivateKey {\n        let bip44Purpose:UInt32 = 44\n        let purpose = privateKey.derived(at: .hardened(bip44Purpose))\n        let coinType = purpose.derived(at: .hardened(coin.coinType))\n        let account = coinType.derived(at: .hardened(0))\n        let receive = account.derived(at: .notHardened(0))\n        return receive\n    }\n    \n    private func generatePrivateKey(at nodes:[DerivationNode]) -> PrivateKey {\n        return privateKey(at: nodes)\n    }\n    \n    private func privateKey(at nodes: [DerivationNode]) -> PrivateKey {\n        var key: PrivateKey = privateKey\n        for node in nodes {\n            key = key.derived(at:node)\n        }\n        return key\n    }\n}\n"
  },
  {
    "path": "HDWalletKit.podspec",
    "content": "Pod::Spec.new do |s|\n  s.name             = 'HDWalletKit'\n  s.version          = '0.3.6'\n  s.summary          = 'Hierarchical Deterministic(HD) wallet for cryptocurrencies in Swift'\n  \n  s.description      = <<-DESC\n      Simple Swift library for creating HD ([Hierarchical Deterministic Wallets](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)) cryptocurrencies wallets and working with crypto Coins/ERC20 tokens.\n                       DESC\n\n  s.homepage         = 'https://github.com/essentiaone/HDWallet.git'\n  s.license          = { :type => 'MIT', :file => 'LICENSE.md' }\n  s.author           = { 'impl' => 'pavlo.bojkoo@gmail.com' }\n  s.source           = { :git => 'https://github.com/essentiaone/HDWallet.git', :tag => s.version.to_s }\n\n  s.swift_version= '5'\n  s.static_framework  = true\n\n  s.ios.deployment_target = '11.0'\n  s.osx.deployment_target = '10.11'\n\n  s.module_name   = \"HDWalletKit\"\n  s.source_files = 'HDWalletKit/**/*.{swift}'\n\n  s.dependency 'secp256k1.swift', '~> 0.1.4'\n  s.dependency 'CryptoSwift', '~> 1.0.0'\n  \nend\n"
  },
  {
    "path": "HDWalletKit.xcodeproj/project.pbxproj",
    "content": "// !$*UTF8*$!\n{\n\tarchiveVersion = 1;\n\tclasses = {\n\t};\n\tobjectVersion = 51;\n\tobjects = {\n\n/* Begin PBXBuildFile section */\n\t\t07F7F4339B91DA419CD2F41A /* Pods_HDWalletKit_HDWalletKit_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 6F9CF1786FD900D725E89FE5 /* Pods_HDWalletKit_HDWalletKit_Tests.framework */; };\n\t\t3401AEFA20F797CB006DEF49 /* EthereumAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3401AEF920F797CB006DEF49 /* EthereumAddress.swift */; };\n\t\t3401AF6E20F908AA006DEF49 /* SecpResult.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3401AF6D20F908AA006DEF49 /* SecpResult.swift */; };\n\t\t3411AEE72164278A00AB9476 /* Coin.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3411AEE62164278A00AB9476 /* Coin.swift */; };\n\t\t3411AF0A21656F0700AB9476 /* PublicKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3411AF0921656F0700AB9476 /* PublicKey.swift */; };\n\t\t3411D0D82279FD3E0016D0C8 /* BitcoinCashAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3411D0D72279FD3E0016D0C8 /* BitcoinCashAddress.swift */; };\n\t\t342233BA227E7B7600C89968 /* ImportWalletTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 342233B9227E7B7600C89968 /* ImportWalletTests.swift */; };\n\t\t344167EC212CC100008B8A91 /* KeystoreTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 344167EB212CC100008B8A91 /* KeystoreTests.swift */; };\n\t\t345639CA226F0CF000ED17DA /* RIPEMD160Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345639C9226F0CF000ED17DA /* RIPEMD160Tests.swift */; };\n\t\t345639CC226F42A500ED17DA /* CryptoSwift.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 345639CB226F42A500ED17DA /* CryptoSwift.framework */; };\n\t\t345639D0226F58BD00ED17DA /* Secp256k1Tets.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345639CF226F58BD00ED17DA /* Secp256k1Tets.swift */; };\n\t\t345B813222675002000E3460 /* UtxoPrivateKeyType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345B813122675002000E3460 /* UtxoPrivateKeyType.swift */; };\n\t\t345B81342268A649000E3460 /* PrivateKeyTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 345B81332268A649000E3460 /* PrivateKeyTests.swift */; };\n\t\t34753F79216E76B70025E0F4 /* WeiEthterConverter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34753F78216E76B70025E0F4 /* WeiEthterConverter.swift */; };\n\t\t34753F7B216E78430025E0F4 /* ConverterTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34753F7A216E78430025E0F4 /* ConverterTests.swift */; };\n\t\t348C10E721D68A2600295370 /* UnspendTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10E621D68A2600295370 /* UnspendTransaction.swift */; };\n\t\t348C10E921D68A3400295370 /* TransactionOutput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10E821D68A3400295370 /* TransactionOutput.swift */; };\n\t\t348C10EB21D68A4100295370 /* TransactionOutPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10EA21D68A4100295370 /* TransactionOutPoint.swift */; };\n\t\t348C115D21D68F2B00295370 /* OpCodeProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10EE21D68F2B00295370 /* OpCodeProtocol.swift */; };\n\t\t348C115E21D68F2B00295370 /* ScriptChunk.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10EF21D68F2B00295370 /* ScriptChunk.swift */; };\n\t\t348C115F21D68F2B00295370 /* ScriptFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F021D68F2B00295370 /* ScriptFactory.swift */; };\n\t\t348C116021D68F2B00295370 /* ScriptExecutionContext.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F121D68F2B00295370 /* ScriptExecutionContext.swift */; };\n\t\t348C116121D68F2B00295370 /* ScriptChunkHelper.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F221D68F2B00295370 /* ScriptChunkHelper.swift */; };\n\t\t348C116221D68F2B00295370 /* OP_SHA1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F521D68F2B00295370 /* OP_SHA1.swift */; };\n\t\t348C116321D68F2B00295370 /* OP_HASH160.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F621D68F2B00295370 /* OP_HASH160.swift */; };\n\t\t348C116421D68F2B00295370 /* OP_SHA256.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F721D68F2B00295370 /* OP_SHA256.swift */; };\n\t\t348C116521D68F2B00295370 /* OP_CHECKMULTISIGVERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F821D68F2B00295370 /* OP_CHECKMULTISIGVERIFY.swift */; };\n\t\t348C116621D68F2B00295370 /* OP_CHECKMULTISIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10F921D68F2B00295370 /* OP_CHECKMULTISIG.swift */; };\n\t\t348C116721D68F2B00295370 /* OP_CHECKSIGVERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10FA21D68F2B00295370 /* OP_CHECKSIGVERIFY.swift */; };\n\t\t348C116821D68F2B00295370 /* OP_RIPEMD160.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10FB21D68F2B00295370 /* OP_RIPEMD160.swift */; };\n\t\t348C116921D68F2B00295370 /* OP_CODESEPARATOR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10FC21D68F2B00295370 /* OP_CODESEPARATOR.swift */; };\n\t\t348C116A21D68F2B00295370 /* OP_CHECKSIG.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10FD21D68F2B00295370 /* OP_CHECKSIG.swift */; };\n\t\t348C116B21D68F2B00295370 /* OP_HASH256.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10FE21D68F2B00295370 /* OP_HASH256.swift */; };\n\t\t348C116C21D68F2B00295370 /* OP_EXAMPLE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C10FF21D68F2B00295370 /* OP_EXAMPLE.swift */; };\n\t\t348C116D21D68F2B00295370 /* OP_AND.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110121D68F2B00295370 /* OP_AND.swift */; };\n\t\t348C116E21D68F2B00295370 /* OP_INVERT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110221D68F2B00295370 /* OP_INVERT.swift */; };\n\t\t348C116F21D68F2B00295370 /* OP_EQUAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110321D68F2B00295370 /* OP_EQUAL.swift */; };\n\t\t348C117021D68F2B00295370 /* OP_RESERVED2.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110421D68F2B00295370 /* OP_RESERVED2.swift */; };\n\t\t348C117121D68F2B00295370 /* OP_EQUALVERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110521D68F2B00295370 /* OP_EQUALVERIFY.swift */; };\n\t\t348C117221D68F2B00295370 /* OP_OR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110621D68F2B00295370 /* OP_OR.swift */; };\n\t\t348C117321D68F2B00295370 /* OP_XOR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110721D68F2B00295370 /* OP_XOR.swift */; };\n\t\t348C117421D68F2B00295370 /* OP_RESERVED1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110821D68F2B00295370 /* OP_RESERVED1.swift */; };\n\t\t348C117521D68F2B00295370 /* OP_PUBKEYHASH.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110A21D68F2B00295370 /* OP_PUBKEYHASH.swift */; };\n\t\t348C117621D68F2B00295370 /* OP_PUBKEY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110B21D68F2B00295370 /* OP_PUBKEY.swift */; };\n\t\t348C117721D68F2B00295370 /* OP_INVALIDOPCODE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110C21D68F2B00295370 /* OP_INVALIDOPCODE.swift */; };\n\t\t348C117821D68F2B00295370 /* OP_BOOLAND.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110E21D68F2B00295370 /* OP_BOOLAND.swift */; };\n\t\t348C117921D68F2B00295370 /* OP_SUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C110F21D68F2B00295370 /* OP_SUB.swift */; };\n\t\t348C117A21D68F2B00295370 /* OP_BOOLOR.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111021D68F2B00295370 /* OP_BOOLOR.swift */; };\n\t\t348C117B21D68F2B00295370 /* OP_RSHIFT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111121D68F2B00295370 /* OP_RSHIFT.swift */; };\n\t\t348C117C21D68F2B00295370 /* OP_LSHIFT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111221D68F2B00295370 /* OP_LSHIFT.swift */; };\n\t\t348C117D21D68F2B00295370 /* OP_MAX.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111321D68F2B00295370 /* OP_MAX.swift */; };\n\t\t348C117E21D68F2B00295370 /* OP_ADD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111421D68F2B00295370 /* OP_ADD.swift */; };\n\t\t348C117F21D68F2B00295370 /* OP_LESSTHAN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111521D68F2B00295370 /* OP_LESSTHAN.swift */; };\n\t\t348C118021D68F2B00295370 /* OP_NUMNOTEQUAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111621D68F2B00295370 /* OP_NUMNOTEQUAL.swift */; };\n\t\t348C118121D68F2B00295370 /* OP_LESSTHANOREQUAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111721D68F2B00295370 /* OP_LESSTHANOREQUAL.swift */; };\n\t\t348C118221D68F2B00295370 /* OP_MOD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111821D68F2B00295370 /* OP_MOD.swift */; };\n\t\t348C118321D68F2B00295370 /* OP_MUL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111921D68F2B00295370 /* OP_MUL.swift */; };\n\t\t348C118421D68F2B00295370 /* OP_DIV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111A21D68F2B00295370 /* OP_DIV.swift */; };\n\t\t348C118521D68F2B00295370 /* OP_GREATERTHANOREQUAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111B21D68F2B00295370 /* OP_GREATERTHANOREQUAL.swift */; };\n\t\t348C118621D68F2B00295370 /* OP_NOT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111C21D68F2B00295370 /* OP_NOT.swift */; };\n\t\t348C118721D68F2B00295370 /* OP_GREATERTHAN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111D21D68F2B00295370 /* OP_GREATERTHAN.swift */; };\n\t\t348C118821D68F2B00295370 /* OP_1ADD.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111E21D68F2B00295370 /* OP_1ADD.swift */; };\n\t\t348C118921D68F2B00295370 /* OP_WITHIN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C111F21D68F2B00295370 /* OP_WITHIN.swift */; };\n\t\t348C118A21D68F2B00295370 /* OP_NEGATE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112021D68F2B00295370 /* OP_NEGATE.swift */; };\n\t\t348C118B21D68F2B00295370 /* OP_NUMEQUALVERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112121D68F2B00295370 /* OP_NUMEQUALVERIFY.swift */; };\n\t\t348C118C21D68F2B00295370 /* OP_2MUL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112221D68F2B00295370 /* OP_2MUL.swift */; };\n\t\t348C118D21D68F2B00295370 /* OP_NUMEQUAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112321D68F2B00295370 /* OP_NUMEQUAL.swift */; };\n\t\t348C118E21D68F2B00295370 /* OP_MIN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112421D68F2B00295370 /* OP_MIN.swift */; };\n\t\t348C118F21D68F2B00295370 /* OP_ABS.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112521D68F2B00295370 /* OP_ABS.swift */; };\n\t\t348C119021D68F2B00295370 /* OP_2DIV.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112621D68F2B00295370 /* OP_2DIV.swift */; };\n\t\t348C119121D68F2C00295370 /* OP_1SUB.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112721D68F2B00295370 /* OP_1SUB.swift */; };\n\t\t348C119221D68F2C00295370 /* OP_0NOTEQUAL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112821D68F2B00295370 /* OP_0NOTEQUAL.swift */; };\n\t\t348C119321D68F2C00295370 /* OP_SIZE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112A21D68F2B00295370 /* OP_SIZE.swift */; };\n\t\t348C119421D68F2C00295370 /* OP_BIN2NUM.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112B21D68F2B00295370 /* OP_BIN2NUM.swift */; };\n\t\t348C119521D68F2C00295370 /* OP_CAT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112C21D68F2B00295370 /* OP_CAT.swift */; };\n\t\t348C119621D68F2C00295370 /* OP_NUM2BIN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112D21D68F2B00295370 /* OP_NUM2BIN.swift */; };\n\t\t348C119721D68F2C00295370 /* OP_SPLIT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C112E21D68F2B00295370 /* OP_SPLIT.swift */; };\n\t\t348C119821D68F2C00295370 /* OP_NOPN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113021D68F2B00295370 /* OP_NOPN.swift */; };\n\t\t348C119921D68F2C00295370 /* OP_2SWAP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113221D68F2B00295370 /* OP_2SWAP.swift */; };\n\t\t348C119A21D68F2C00295370 /* OP_TUCK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113321D68F2B00295370 /* OP_TUCK.swift */; };\n\t\t348C119B21D68F2C00295370 /* OP_ROLL.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113421D68F2B00295370 /* OP_ROLL.swift */; };\n\t\t348C119C21D68F2C00295370 /* OP_SWAP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113521D68F2B00295370 /* OP_SWAP.swift */; };\n\t\t348C119D21D68F2C00295370 /* OP_2DROP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113621D68F2B00295370 /* OP_2DROP.swift */; };\n\t\t348C119E21D68F2C00295370 /* OP_TOTALSTACK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113721D68F2B00295370 /* OP_TOTALSTACK.swift */; };\n\t\t348C119F21D68F2C00295370 /* OP_DROP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113821D68F2B00295370 /* OP_DROP.swift */; };\n\t\t348C11A021D68F2C00295370 /* OP_DEPTH.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113921D68F2B00295370 /* OP_DEPTH.swift */; };\n\t\t348C11A121D68F2C00295370 /* OP_FROMALTSTACK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113A21D68F2B00295370 /* OP_FROMALTSTACK.swift */; };\n\t\t348C11A221D68F2C00295370 /* OP_2DUP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113B21D68F2B00295370 /* OP_2DUP.swift */; };\n\t\t348C11A321D68F2C00295370 /* OP_3DUP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113C21D68F2B00295370 /* OP_3DUP.swift */; };\n\t\t348C11A421D68F2C00295370 /* OP_ROT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113D21D68F2B00295370 /* OP_ROT.swift */; };\n\t\t348C11A521D68F2C00295370 /* OP_PICK.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113E21D68F2B00295370 /* OP_PICK.swift */; };\n\t\t348C11A621D68F2C00295370 /* OP_2OVER.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C113F21D68F2B00295370 /* OP_2OVER.swift */; };\n\t\t348C11A721D68F2C00295370 /* OP_NIP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114021D68F2B00295370 /* OP_NIP.swift */; };\n\t\t348C11A821D68F2C00295370 /* OP_IFDUP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114121D68F2B00295370 /* OP_IFDUP.swift */; };\n\t\t348C11A921D68F2C00295370 /* OP_DUP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114221D68F2B00295370 /* OP_DUP.swift */; };\n\t\t348C11AA21D68F2C00295370 /* OP_2ROT.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114321D68F2B00295370 /* OP_2ROT.swift */; };\n\t\t348C11AB21D68F2C00295370 /* OP_OVER.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114421D68F2B00295370 /* OP_OVER.swift */; };\n\t\t348C11AC21D68F2C00295370 /* OP_CHECKLOCKTIMEVERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114621D68F2B00295370 /* OP_CHECKLOCKTIMEVERIFY.swift */; };\n\t\t348C11AD21D68F2C00295370 /* OP_CHECKSEQUENCEVERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114721D68F2B00295370 /* OP_CHECKSEQUENCEVERIFY.swift */; };\n\t\t348C11AE21D68F2C00295370 /* OP_RESERVED.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114921D68F2B00295370 /* OP_RESERVED.swift */; };\n\t\t348C11AF21D68F2C00295370 /* OP_1NEGATE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114A21D68F2B00295370 /* OP_1NEGATE.swift */; };\n\t\t348C11B021D68F2C00295370 /* OP_0.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114B21D68F2B00295370 /* OP_0.swift */; };\n\t\t348C11B121D68F2C00295370 /* OP_N.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114C21D68F2B00295370 /* OP_N.swift */; };\n\t\t348C11B221D68F2C00295370 /* OP_PUSHDATA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114D21D68F2B00295370 /* OP_PUSHDATA.swift */; };\n\t\t348C11B321D68F2C00295370 /* OP_VER.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C114F21D68F2B00295370 /* OP_VER.swift */; };\n\t\t348C11B421D68F2C00295370 /* OP_NOTIF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115021D68F2B00295370 /* OP_NOTIF.swift */; };\n\t\t348C11B521D68F2C00295370 /* OP_RETURN.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115121D68F2B00295370 /* OP_RETURN.swift */; };\n\t\t348C11B621D68F2C00295370 /* OP_VERIFY.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115221D68F2B00295370 /* OP_VERIFY.swift */; };\n\t\t348C11B721D68F2C00295370 /* OP_IF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115321D68F2B00295370 /* OP_IF.swift */; };\n\t\t348C11B821D68F2C00295370 /* OP_NOP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115421D68F2B00295370 /* OP_NOP.swift */; };\n\t\t348C11B921D68F2C00295370 /* OP_ELSE.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115521D68F2B00295370 /* OP_ELSE.swift */; };\n\t\t348C11BA21D68F2C00295370 /* OP_VERNOTIF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115621D68F2B00295370 /* OP_VERNOTIF.swift */; };\n\t\t348C11BB21D68F2C00295370 /* OP_VERIF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115721D68F2B00295370 /* OP_VERIF.swift */; };\n\t\t348C11BC21D68F2C00295370 /* OP_ENDIF.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115821D68F2B00295370 /* OP_ENDIF.swift */; };\n\t\t348C11BD21D68F2C00295370 /* Opcode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115921D68F2B00295370 /* Opcode.swift */; };\n\t\t348C11BE21D68F2C00295370 /* OpCodeFactory.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115A21D68F2B00295370 /* OpCodeFactory.swift */; };\n\t\t348C11BF21D68F2C00295370 /* Script.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115B21D68F2B00295370 /* Script.swift */; };\n\t\t348C11C021D68F2C00295370 /* ScriptMachine.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C115C21D68F2B00295370 /* ScriptMachine.swift */; };\n\t\t348C11C921DFDB9400295370 /* Data+Script.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C11C821DFDB9400295370 /* Data+Script.swift */; };\n\t\t348C11CB21E1675B00295370 /* UtilsAndLimits.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348C11CA21E1675B00295370 /* UtilsAndLimits.swift */; };\n\t\t348FA3BC224A4C9D00DA3F1B /* UTXOSign.swift in Sources */ = {isa = PBXBuildFile; fileRef = 348FA3BB224A4C9D00DA3F1B /* UTXOSign.swift */; };\n\t\t3492213320F64D9B00A59A6F /* BigInt+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492211C20F64D9B00A59A6F /* BigInt+Extension.swift */; };\n\t\t3492213420F64D9B00A59A6F /* SMP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492211D20F64D9B00A59A6F /* SMP.swift */; };\n\t\t3492213520F64D9B00A59A6F /* Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212020F64D9B00A59A6F /* Crypto.swift */; };\n\t\t3492213620F64D9B00A59A6F /* ECDSA.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212120F64D9B00A59A6F /* ECDSA.swift */; };\n\t\t3492213720F64D9B00A59A6F /* RIPEMD160.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212320F64D9B00A59A6F /* RIPEMD160.swift */; };\n\t\t3492213820F64D9B00A59A6F /* DataConvertable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212420F64D9B00A59A6F /* DataConvertable.swift */; };\n\t\t3492213920F64D9B00A59A6F /* DerivationNode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212520F64D9B00A59A6F /* DerivationNode.swift */; };\n\t\t3492213A20F64D9B00A59A6F /* Base58Encode.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212720F64D9B00A59A6F /* Base58Encode.swift */; };\n\t\t3492213B20F64D9B00A59A6F /* EIP55.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212820F64D9B00A59A6F /* EIP55.swift */; };\n\t\t3492213C20F64D9B00A59A6F /* Mnemonic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212A20F64D9B00A59A6F /* Mnemonic.swift */; };\n\t\t3492213D20F64D9B00A59A6F /* WordList.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212B20F64D9B00A59A6F /* WordList.swift */; };\n\t\t3492213E20F64D9B00A59A6F /* Account.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492212D20F64D9B00A59A6F /* Account.swift */; };\n\t\t3492214020F64D9B00A59A6F /* PrivateKey.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492213020F64D9B00A59A6F /* PrivateKey.swift */; };\n\t\t3492214220F64D9B00A59A6F /* Wallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492213220F64D9B00A59A6F /* Wallet.swift */; };\n\t\t3492214C20F64E0300A59A6F /* libHDWalletKit.a in Frameworks */ = {isa = PBXBuildFile; fileRef = 349220E520F64C6600A59A6F /* libHDWalletKit.a */; };\n\t\t3492215D20F6B4B600A59A6F /* EthereumRawTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492215720F6B4B400A59A6F /* EthereumRawTransaction.swift */; };\n\t\t3492216220F6B53300A59A6F /* Typealiaces.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492216120F6B53300A59A6F /* Typealiaces.swift */; };\n\t\t3492216520F6B79400A59A6F /* EIP155Signer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492216320F6B79300A59A6F /* EIP155Signer.swift */; };\n\t\t3492216620F6B79400A59A6F /* RLP.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492216420F6B79400A59A6F /* RLP.swift */; };\n\t\t3492216B20F747EC00A59A6F /* EllipticCurveEncrypterSecp256k1.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492216A20F747EC00A59A6F /* EllipticCurveEncrypterSecp256k1.swift */; };\n\t\t34A5322E215307DF00B95C66 /* SignTransactionTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A5322D215307DF00B95C66 /* SignTransactionTests.swift */; };\n\t\t34A532322158E66900B95C66 /* ERC20.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A532312158E66900B95C66 /* ERC20.swift */; };\n\t\t34A532342158E96C00B95C66 /* ERC20Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34A532332158E96C00B95C66 /* ERC20Tests.swift */; };\n\t\t34B7964A21296427000B1251 /* KeystoreV3Json.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7964921296427000B1251 /* KeystoreV3Json.swift */; };\n\t\t34B7964C212A881C000B1251 /* KeystoreInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7964B212A881C000B1251 /* KeystoreInterface.swift */; };\n\t\t34B7964E212A93A0000B1251 /* KeystoreV3.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7964D212A93A0000B1251 /* KeystoreV3.swift */; };\n\t\t34B79650212A95D5000B1251 /* Data+Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7964F212A95D5000B1251 /* Data+Random.swift */; };\n\t\t34B7B84D20F7572900D2C34A /* HDWalletKitError.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3492216820F7466800A59A6F /* HDWalletKitError.swift */; };\n\t\t34B7B84F20F75DBF00D2C34A /* MnemonicTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7B84E20F75DBF00D2C34A /* MnemonicTests.swift */; };\n\t\t34B7B85120F75E4E00D2C34A /* CryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7B85020F75E4E00D2C34A /* CryptoTests.swift */; };\n\t\t34B7B85320F75E5B00D2C34A /* AddressGenerationTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7B85220F75E5B00D2C34A /* AddressGenerationTests.swift */; };\n\t\t34B7B85720F7848D00D2C34A /* String+Hex.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34B7B85620F7848D00D2C34A /* String+Hex.swift */; };\n\t\t34C9B1B621E2AE6700198EAF /* BigNumber.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1B521E2AE6700198EAF /* BigNumber.swift */; };\n\t\t34C9B1B821E2B06300198EAF /* ByteStream.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1B721E2B06300198EAF /* ByteStream.swift */; };\n\t\t34C9B1BA21E2B09500198EAF /* VarInt.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1B921E2B09500198EAF /* VarInt.swift */; };\n\t\t34C9B1BC21E2B0D400198EAF /* VarString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1BB21E2B0D400198EAF /* VarString.swift */; };\n\t\t34C9B1BE21E2B38B00198EAF /* SighashType.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1BD21E2B38B00198EAF /* SighashType.swift */; };\n\t\t34C9B1C021E2B3E700198EAF /* TransactionInput.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1BF21E2B3E700198EAF /* TransactionInput.swift */; };\n\t\t34C9B1C221E5065000198EAF /* BitcoinAddress.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1C121E5065000198EAF /* BitcoinAddress.swift */; };\n\t\t34C9B1C821E5087900198EAF /* Transaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1C721E5087900198EAF /* Transaction.swift */; };\n\t\t34C9B1CA21E50A1700198EAF /* BitcoinCashVersionByte.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34C9B1C921E50A1700198EAF /* BitcoinCashVersionByte.swift */; };\n\t\t34D9CC442209BFAF00B3A625 /* Bech32.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CC432209BFAF00B3A625 /* Bech32.swift */; };\n\t\t34D9CC462209CD4300B3A625 /* Transaction+SignatureHash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CC452209CD4300B3A625 /* Transaction+SignatureHash.swift */; };\n\t\t34D9CC482209CDB900B3A625 /* BitcoinTransactionSignatureSerializer.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CC472209CDB900B3A625 /* BitcoinTransactionSignatureSerializer.swift */; };\n\t\t34D9CC4A2212FE9D00B3A625 /* UtxoSelector.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CC492212FE9D00B3A625 /* UtxoSelector.swift */; };\n\t\t34D9CF2C22199E6000B3A625 /* UtxoTransactionBuilder.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF2B22199E6000B3A625 /* UtxoTransactionBuilder.swift */; };\n\t\t34D9CF2E22199ED300B3A625 /* UnsignedTransaction.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF2D22199ED300B3A625 /* UnsignedTransaction.swift */; };\n\t\t34D9CF30221C361D00B3A625 /* UTXOWallet.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF2F221C361D00B3A625 /* UTXOWallet.swift */; };\n\t\t34D9CF35221C3A9900B3A625 /* UtxoSelectorInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF34221C3A9900B3A625 /* UtxoSelectorInterface.swift */; };\n\t\t34D9CF37221C3AAF00B3A625 /* UtxoTransactionBuilderInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF36221C3AAF00B3A625 /* UtxoTransactionBuilderInterface.swift */; };\n\t\t34D9CF39221C3AC100B3A625 /* UtxoTransactionSignerInterface.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF38221C3AC100B3A625 /* UtxoTransactionSignerInterface.swift */; };\n\t\t34D9CF48221C447D00B3A625 /* UtxoTransactionSigner.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34D9CF47221C447D00B3A625 /* UtxoTransactionSigner.swift */; };\n\t\t8602371595DB64FDBE46000C /* Pods_HDWalletKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = A71916E6C32DA0D7349D72D7 /* Pods_HDWalletKit.framework */; };\n/* End PBXBuildFile section */\n\n/* Begin PBXContainerItemProxy section */\n\t\t3492214D20F64E0300A59A6F /* PBXContainerItemProxy */ = {\n\t\t\tisa = PBXContainerItemProxy;\n\t\t\tcontainerPortal = 349220DD20F64C6600A59A6F /* Project object */;\n\t\t\tproxyType = 1;\n\t\t\tremoteGlobalIDString = 349220E420F64C6600A59A6F;\n\t\t\tremoteInfo = HDWalletKit;\n\t\t};\n/* End PBXContainerItemProxy section */\n\n/* Begin PBXCopyFilesBuildPhase section */\n\t\t349220E320F64C6600A59A6F /* CopyFiles */ = {\n\t\t\tisa = PBXCopyFilesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tdstPath = \"include/$(PRODUCT_NAME)\";\n\t\t\tdstSubfolderSpec = 16;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXCopyFilesBuildPhase section */\n\n/* Begin PBXFileReference section */\n\t\t24463252CD56603F58800D8F /* Pods-HDWalletKit-HDWalletKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-HDWalletKit-HDWalletKit_Tests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-HDWalletKit-HDWalletKit_Tests/Pods-HDWalletKit-HDWalletKit_Tests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t29695349E80AB7F880E24B02 /* Pods-HDWalletKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-HDWalletKit_Tests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-HDWalletKit_Tests/Pods-HDWalletKit_Tests.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\t3401AEF920F797CB006DEF49 /* EthereumAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EthereumAddress.swift; sourceTree = \"<group>\"; };\n\t\t3401AF6D20F908AA006DEF49 /* SecpResult.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SecpResult.swift; sourceTree = \"<group>\"; };\n\t\t3411AEE62164278A00AB9476 /* Coin.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Coin.swift; sourceTree = \"<group>\"; };\n\t\t3411AF0921656F0700AB9476 /* PublicKey.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PublicKey.swift; sourceTree = \"<group>\"; };\n\t\t3411D0D72279FD3E0016D0C8 /* BitcoinCashAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitcoinCashAddress.swift; sourceTree = \"<group>\"; };\n\t\t342233B9227E7B7600C89968 /* ImportWalletTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ImportWalletTests.swift; sourceTree = \"<group>\"; };\n\t\t344167EB212CC100008B8A91 /* KeystoreTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeystoreTests.swift; sourceTree = \"<group>\"; };\n\t\t345639C9226F0CF000ED17DA /* RIPEMD160Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RIPEMD160Tests.swift; sourceTree = \"<group>\"; };\n\t\t345639CB226F42A500ED17DA /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t345639CD226F42BC00ED17DA /* CryptoSwift.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; path = CryptoSwift.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t345639CF226F58BD00ED17DA /* Secp256k1Tets.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Secp256k1Tets.swift; sourceTree = \"<group>\"; };\n\t\t345B813122675002000E3460 /* UtxoPrivateKeyType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoPrivateKeyType.swift; sourceTree = \"<group>\"; };\n\t\t345B81332268A649000E3460 /* PrivateKeyTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = PrivateKeyTests.swift; sourceTree = \"<group>\"; };\n\t\t34753F78216E76B70025E0F4 /* WeiEthterConverter.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = WeiEthterConverter.swift; sourceTree = \"<group>\"; };\n\t\t34753F7A216E78430025E0F4 /* ConverterTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ConverterTests.swift; sourceTree = \"<group>\"; };\n\t\t348C10E621D68A2600295370 /* UnspendTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnspendTransaction.swift; sourceTree = \"<group>\"; };\n\t\t348C10E821D68A3400295370 /* TransactionOutput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionOutput.swift; sourceTree = \"<group>\"; };\n\t\t348C10EA21D68A4100295370 /* TransactionOutPoint.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionOutPoint.swift; sourceTree = \"<group>\"; };\n\t\t348C10EE21D68F2B00295370 /* OpCodeProtocol.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpCodeProtocol.swift; sourceTree = \"<group>\"; };\n\t\t348C10EF21D68F2B00295370 /* ScriptChunk.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScriptChunk.swift; sourceTree = \"<group>\"; };\n\t\t348C10F021D68F2B00295370 /* ScriptFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScriptFactory.swift; sourceTree = \"<group>\"; };\n\t\t348C10F121D68F2B00295370 /* ScriptExecutionContext.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScriptExecutionContext.swift; sourceTree = \"<group>\"; };\n\t\t348C10F221D68F2B00295370 /* ScriptChunkHelper.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScriptChunkHelper.swift; sourceTree = \"<group>\"; };\n\t\t348C10F521D68F2B00295370 /* OP_SHA1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_SHA1.swift; sourceTree = \"<group>\"; };\n\t\t348C10F621D68F2B00295370 /* OP_HASH160.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_HASH160.swift; sourceTree = \"<group>\"; };\n\t\t348C10F721D68F2B00295370 /* OP_SHA256.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_SHA256.swift; sourceTree = \"<group>\"; };\n\t\t348C10F821D68F2B00295370 /* OP_CHECKMULTISIGVERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CHECKMULTISIGVERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C10F921D68F2B00295370 /* OP_CHECKMULTISIG.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CHECKMULTISIG.swift; sourceTree = \"<group>\"; };\n\t\t348C10FA21D68F2B00295370 /* OP_CHECKSIGVERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CHECKSIGVERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C10FB21D68F2B00295370 /* OP_RIPEMD160.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_RIPEMD160.swift; sourceTree = \"<group>\"; };\n\t\t348C10FC21D68F2B00295370 /* OP_CODESEPARATOR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CODESEPARATOR.swift; sourceTree = \"<group>\"; };\n\t\t348C10FD21D68F2B00295370 /* OP_CHECKSIG.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CHECKSIG.swift; sourceTree = \"<group>\"; };\n\t\t348C10FE21D68F2B00295370 /* OP_HASH256.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_HASH256.swift; sourceTree = \"<group>\"; };\n\t\t348C10FF21D68F2B00295370 /* OP_EXAMPLE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_EXAMPLE.swift; sourceTree = \"<group>\"; };\n\t\t348C110121D68F2B00295370 /* OP_AND.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_AND.swift; sourceTree = \"<group>\"; };\n\t\t348C110221D68F2B00295370 /* OP_INVERT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_INVERT.swift; sourceTree = \"<group>\"; };\n\t\t348C110321D68F2B00295370 /* OP_EQUAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_EQUAL.swift; sourceTree = \"<group>\"; };\n\t\t348C110421D68F2B00295370 /* OP_RESERVED2.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_RESERVED2.swift; sourceTree = \"<group>\"; };\n\t\t348C110521D68F2B00295370 /* OP_EQUALVERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_EQUALVERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C110621D68F2B00295370 /* OP_OR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_OR.swift; sourceTree = \"<group>\"; };\n\t\t348C110721D68F2B00295370 /* OP_XOR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_XOR.swift; sourceTree = \"<group>\"; };\n\t\t348C110821D68F2B00295370 /* OP_RESERVED1.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_RESERVED1.swift; sourceTree = \"<group>\"; };\n\t\t348C110A21D68F2B00295370 /* OP_PUBKEYHASH.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_PUBKEYHASH.swift; sourceTree = \"<group>\"; };\n\t\t348C110B21D68F2B00295370 /* OP_PUBKEY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_PUBKEY.swift; sourceTree = \"<group>\"; };\n\t\t348C110C21D68F2B00295370 /* OP_INVALIDOPCODE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_INVALIDOPCODE.swift; sourceTree = \"<group>\"; };\n\t\t348C110E21D68F2B00295370 /* OP_BOOLAND.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_BOOLAND.swift; sourceTree = \"<group>\"; };\n\t\t348C110F21D68F2B00295370 /* OP_SUB.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_SUB.swift; sourceTree = \"<group>\"; };\n\t\t348C111021D68F2B00295370 /* OP_BOOLOR.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_BOOLOR.swift; sourceTree = \"<group>\"; };\n\t\t348C111121D68F2B00295370 /* OP_RSHIFT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_RSHIFT.swift; sourceTree = \"<group>\"; };\n\t\t348C111221D68F2B00295370 /* OP_LSHIFT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_LSHIFT.swift; sourceTree = \"<group>\"; };\n\t\t348C111321D68F2B00295370 /* OP_MAX.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_MAX.swift; sourceTree = \"<group>\"; };\n\t\t348C111421D68F2B00295370 /* OP_ADD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_ADD.swift; sourceTree = \"<group>\"; };\n\t\t348C111521D68F2B00295370 /* OP_LESSTHAN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_LESSTHAN.swift; sourceTree = \"<group>\"; };\n\t\t348C111621D68F2B00295370 /* OP_NUMNOTEQUAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NUMNOTEQUAL.swift; sourceTree = \"<group>\"; };\n\t\t348C111721D68F2B00295370 /* OP_LESSTHANOREQUAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_LESSTHANOREQUAL.swift; sourceTree = \"<group>\"; };\n\t\t348C111821D68F2B00295370 /* OP_MOD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_MOD.swift; sourceTree = \"<group>\"; };\n\t\t348C111921D68F2B00295370 /* OP_MUL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_MUL.swift; sourceTree = \"<group>\"; };\n\t\t348C111A21D68F2B00295370 /* OP_DIV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_DIV.swift; sourceTree = \"<group>\"; };\n\t\t348C111B21D68F2B00295370 /* OP_GREATERTHANOREQUAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_GREATERTHANOREQUAL.swift; sourceTree = \"<group>\"; };\n\t\t348C111C21D68F2B00295370 /* OP_NOT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NOT.swift; sourceTree = \"<group>\"; };\n\t\t348C111D21D68F2B00295370 /* OP_GREATERTHAN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_GREATERTHAN.swift; sourceTree = \"<group>\"; };\n\t\t348C111E21D68F2B00295370 /* OP_1ADD.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_1ADD.swift; sourceTree = \"<group>\"; };\n\t\t348C111F21D68F2B00295370 /* OP_WITHIN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_WITHIN.swift; sourceTree = \"<group>\"; };\n\t\t348C112021D68F2B00295370 /* OP_NEGATE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NEGATE.swift; sourceTree = \"<group>\"; };\n\t\t348C112121D68F2B00295370 /* OP_NUMEQUALVERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NUMEQUALVERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C112221D68F2B00295370 /* OP_2MUL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2MUL.swift; sourceTree = \"<group>\"; };\n\t\t348C112321D68F2B00295370 /* OP_NUMEQUAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NUMEQUAL.swift; sourceTree = \"<group>\"; };\n\t\t348C112421D68F2B00295370 /* OP_MIN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_MIN.swift; sourceTree = \"<group>\"; };\n\t\t348C112521D68F2B00295370 /* OP_ABS.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_ABS.swift; sourceTree = \"<group>\"; };\n\t\t348C112621D68F2B00295370 /* OP_2DIV.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2DIV.swift; sourceTree = \"<group>\"; };\n\t\t348C112721D68F2B00295370 /* OP_1SUB.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_1SUB.swift; sourceTree = \"<group>\"; };\n\t\t348C112821D68F2B00295370 /* OP_0NOTEQUAL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_0NOTEQUAL.swift; sourceTree = \"<group>\"; };\n\t\t348C112A21D68F2B00295370 /* OP_SIZE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_SIZE.swift; sourceTree = \"<group>\"; };\n\t\t348C112B21D68F2B00295370 /* OP_BIN2NUM.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_BIN2NUM.swift; sourceTree = \"<group>\"; };\n\t\t348C112C21D68F2B00295370 /* OP_CAT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CAT.swift; sourceTree = \"<group>\"; };\n\t\t348C112D21D68F2B00295370 /* OP_NUM2BIN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NUM2BIN.swift; sourceTree = \"<group>\"; };\n\t\t348C112E21D68F2B00295370 /* OP_SPLIT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_SPLIT.swift; sourceTree = \"<group>\"; };\n\t\t348C113021D68F2B00295370 /* OP_NOPN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NOPN.swift; sourceTree = \"<group>\"; };\n\t\t348C113221D68F2B00295370 /* OP_2SWAP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2SWAP.swift; sourceTree = \"<group>\"; };\n\t\t348C113321D68F2B00295370 /* OP_TUCK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_TUCK.swift; sourceTree = \"<group>\"; };\n\t\t348C113421D68F2B00295370 /* OP_ROLL.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_ROLL.swift; sourceTree = \"<group>\"; };\n\t\t348C113521D68F2B00295370 /* OP_SWAP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_SWAP.swift; sourceTree = \"<group>\"; };\n\t\t348C113621D68F2B00295370 /* OP_2DROP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2DROP.swift; sourceTree = \"<group>\"; };\n\t\t348C113721D68F2B00295370 /* OP_TOTALSTACK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_TOTALSTACK.swift; sourceTree = \"<group>\"; };\n\t\t348C113821D68F2B00295370 /* OP_DROP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_DROP.swift; sourceTree = \"<group>\"; };\n\t\t348C113921D68F2B00295370 /* OP_DEPTH.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_DEPTH.swift; sourceTree = \"<group>\"; };\n\t\t348C113A21D68F2B00295370 /* OP_FROMALTSTACK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_FROMALTSTACK.swift; sourceTree = \"<group>\"; };\n\t\t348C113B21D68F2B00295370 /* OP_2DUP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2DUP.swift; sourceTree = \"<group>\"; };\n\t\t348C113C21D68F2B00295370 /* OP_3DUP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_3DUP.swift; sourceTree = \"<group>\"; };\n\t\t348C113D21D68F2B00295370 /* OP_ROT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_ROT.swift; sourceTree = \"<group>\"; };\n\t\t348C113E21D68F2B00295370 /* OP_PICK.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_PICK.swift; sourceTree = \"<group>\"; };\n\t\t348C113F21D68F2B00295370 /* OP_2OVER.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2OVER.swift; sourceTree = \"<group>\"; };\n\t\t348C114021D68F2B00295370 /* OP_NIP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NIP.swift; sourceTree = \"<group>\"; };\n\t\t348C114121D68F2B00295370 /* OP_IFDUP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_IFDUP.swift; sourceTree = \"<group>\"; };\n\t\t348C114221D68F2B00295370 /* OP_DUP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_DUP.swift; sourceTree = \"<group>\"; };\n\t\t348C114321D68F2B00295370 /* OP_2ROT.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_2ROT.swift; sourceTree = \"<group>\"; };\n\t\t348C114421D68F2B00295370 /* OP_OVER.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_OVER.swift; sourceTree = \"<group>\"; };\n\t\t348C114621D68F2B00295370 /* OP_CHECKLOCKTIMEVERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CHECKLOCKTIMEVERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C114721D68F2B00295370 /* OP_CHECKSEQUENCEVERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_CHECKSEQUENCEVERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C114921D68F2B00295370 /* OP_RESERVED.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_RESERVED.swift; sourceTree = \"<group>\"; };\n\t\t348C114A21D68F2B00295370 /* OP_1NEGATE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_1NEGATE.swift; sourceTree = \"<group>\"; };\n\t\t348C114B21D68F2B00295370 /* OP_0.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_0.swift; sourceTree = \"<group>\"; };\n\t\t348C114C21D68F2B00295370 /* OP_N.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_N.swift; sourceTree = \"<group>\"; };\n\t\t348C114D21D68F2B00295370 /* OP_PUSHDATA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_PUSHDATA.swift; sourceTree = \"<group>\"; };\n\t\t348C114F21D68F2B00295370 /* OP_VER.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_VER.swift; sourceTree = \"<group>\"; };\n\t\t348C115021D68F2B00295370 /* OP_NOTIF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NOTIF.swift; sourceTree = \"<group>\"; };\n\t\t348C115121D68F2B00295370 /* OP_RETURN.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_RETURN.swift; sourceTree = \"<group>\"; };\n\t\t348C115221D68F2B00295370 /* OP_VERIFY.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_VERIFY.swift; sourceTree = \"<group>\"; };\n\t\t348C115321D68F2B00295370 /* OP_IF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_IF.swift; sourceTree = \"<group>\"; };\n\t\t348C115421D68F2B00295370 /* OP_NOP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_NOP.swift; sourceTree = \"<group>\"; };\n\t\t348C115521D68F2B00295370 /* OP_ELSE.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_ELSE.swift; sourceTree = \"<group>\"; };\n\t\t348C115621D68F2B00295370 /* OP_VERNOTIF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_VERNOTIF.swift; sourceTree = \"<group>\"; };\n\t\t348C115721D68F2B00295370 /* OP_VERIF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_VERIF.swift; sourceTree = \"<group>\"; };\n\t\t348C115821D68F2B00295370 /* OP_ENDIF.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OP_ENDIF.swift; sourceTree = \"<group>\"; };\n\t\t348C115921D68F2B00295370 /* Opcode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Opcode.swift; sourceTree = \"<group>\"; };\n\t\t348C115A21D68F2B00295370 /* OpCodeFactory.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = OpCodeFactory.swift; sourceTree = \"<group>\"; };\n\t\t348C115B21D68F2B00295370 /* Script.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Script.swift; sourceTree = \"<group>\"; };\n\t\t348C115C21D68F2B00295370 /* ScriptMachine.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ScriptMachine.swift; sourceTree = \"<group>\"; };\n\t\t348C11C821DFDB9400295370 /* Data+Script.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Data+Script.swift\"; sourceTree = \"<group>\"; };\n\t\t348C11CA21E1675B00295370 /* UtilsAndLimits.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtilsAndLimits.swift; sourceTree = \"<group>\"; };\n\t\t348FA3BB224A4C9D00DA3F1B /* UTXOSign.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UTXOSign.swift; sourceTree = \"<group>\"; };\n\t\t349220E520F64C6600A59A6F /* libHDWalletKit.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libHDWalletKit.a; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3492211C20F64D9B00A59A6F /* BigInt+Extension.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = \"BigInt+Extension.swift\"; sourceTree = \"<group>\"; };\n\t\t3492211D20F64D9B00A59A6F /* SMP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SMP.swift; sourceTree = \"<group>\"; };\n\t\t3492212020F64D9B00A59A6F /* Crypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = \"<group>\"; };\n\t\t3492212120F64D9B00A59A6F /* ECDSA.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ECDSA.swift; sourceTree = \"<group>\"; };\n\t\t3492212320F64D9B00A59A6F /* RIPEMD160.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RIPEMD160.swift; sourceTree = \"<group>\"; };\n\t\t3492212420F64D9B00A59A6F /* DataConvertable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataConvertable.swift; sourceTree = \"<group>\"; };\n\t\t3492212520F64D9B00A59A6F /* DerivationNode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DerivationNode.swift; sourceTree = \"<group>\"; };\n\t\t3492212720F64D9B00A59A6F /* Base58Encode.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Base58Encode.swift; sourceTree = \"<group>\"; };\n\t\t3492212820F64D9B00A59A6F /* EIP55.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EIP55.swift; sourceTree = \"<group>\"; };\n\t\t3492212A20F64D9B00A59A6F /* Mnemonic.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Mnemonic.swift; sourceTree = \"<group>\"; };\n\t\t3492212B20F64D9B00A59A6F /* WordList.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = WordList.swift; sourceTree = \"<group>\"; };\n\t\t3492212D20F64D9B00A59A6F /* Account.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Account.swift; sourceTree = \"<group>\"; };\n\t\t3492213020F64D9B00A59A6F /* PrivateKey.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = PrivateKey.swift; sourceTree = \"<group>\"; };\n\t\t3492213220F64D9B00A59A6F /* Wallet.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Wallet.swift; sourceTree = \"<group>\"; };\n\t\t3492214720F64E0300A59A6F /* HDWalletKit_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = HDWalletKit_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t3492214B20F64E0300A59A6F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = \"<group>\"; };\n\t\t3492215720F6B4B400A59A6F /* EthereumRawTransaction.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EthereumRawTransaction.swift; sourceTree = \"<group>\"; };\n\t\t3492216120F6B53300A59A6F /* Typealiaces.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Typealiaces.swift; sourceTree = \"<group>\"; };\n\t\t3492216320F6B79300A59A6F /* EIP155Signer.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EIP155Signer.swift; sourceTree = \"<group>\"; };\n\t\t3492216420F6B79400A59A6F /* RLP.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = RLP.swift; sourceTree = \"<group>\"; };\n\t\t3492216820F7466800A59A6F /* HDWalletKitError.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HDWalletKitError.swift; sourceTree = \"<group>\"; };\n\t\t3492216A20F747EC00A59A6F /* EllipticCurveEncrypterSecp256k1.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EllipticCurveEncrypterSecp256k1.swift; sourceTree = \"<group>\"; };\n\t\t34A5322D215307DF00B95C66 /* SignTransactionTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SignTransactionTests.swift; sourceTree = \"<group>\"; };\n\t\t34A532312158E66900B95C66 /* ERC20.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ERC20.swift; sourceTree = \"<group>\"; };\n\t\t34A532332158E96C00B95C66 /* ERC20Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ERC20Tests.swift; sourceTree = \"<group>\"; };\n\t\t34B7964921296427000B1251 /* KeystoreV3Json.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeystoreV3Json.swift; sourceTree = \"<group>\"; };\n\t\t34B7964B212A881C000B1251 /* KeystoreInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeystoreInterface.swift; sourceTree = \"<group>\"; };\n\t\t34B7964D212A93A0000B1251 /* KeystoreV3.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeystoreV3.swift; sourceTree = \"<group>\"; };\n\t\t34B7964F212A95D5000B1251 /* Data+Random.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Data+Random.swift\"; sourceTree = \"<group>\"; };\n\t\t34B7B84E20F75DBF00D2C34A /* MnemonicTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MnemonicTests.swift; sourceTree = \"<group>\"; };\n\t\t34B7B85020F75E4E00D2C34A /* CryptoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CryptoTests.swift; sourceTree = \"<group>\"; };\n\t\t34B7B85220F75E5B00D2C34A /* AddressGenerationTests.swift */ = {isa = PBXFileReference; indentWidth = 4; lastKnownFileType = sourcecode.swift; path = AddressGenerationTests.swift; sourceTree = \"<group>\"; };\n\t\t34B7B85620F7848D00D2C34A /* String+Hex.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"String+Hex.swift\"; sourceTree = \"<group>\"; };\n\t\t34C9B1B521E2AE6700198EAF /* BigNumber.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BigNumber.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1B721E2B06300198EAF /* ByteStream.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ByteStream.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1B921E2B09500198EAF /* VarInt.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VarInt.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1BB21E2B0D400198EAF /* VarString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VarString.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1BD21E2B38B00198EAF /* SighashType.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SighashType.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1BF21E2B3E700198EAF /* TransactionInput.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TransactionInput.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1C121E5065000198EAF /* BitcoinAddress.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitcoinAddress.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1C721E5087900198EAF /* Transaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Transaction.swift; sourceTree = \"<group>\"; };\n\t\t34C9B1C921E50A1700198EAF /* BitcoinCashVersionByte.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitcoinCashVersionByte.swift; sourceTree = \"<group>\"; };\n\t\t34D9CC432209BFAF00B3A625 /* Bech32.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Bech32.swift; sourceTree = \"<group>\"; };\n\t\t34D9CC452209CD4300B3A625 /* Transaction+SignatureHash.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = \"Transaction+SignatureHash.swift\"; sourceTree = \"<group>\"; };\n\t\t34D9CC472209CDB900B3A625 /* BitcoinTransactionSignatureSerializer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = BitcoinTransactionSignatureSerializer.swift; sourceTree = \"<group>\"; };\n\t\t34D9CC492212FE9D00B3A625 /* UtxoSelector.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoSelector.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF2B22199E6000B3A625 /* UtxoTransactionBuilder.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoTransactionBuilder.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF2D22199ED300B3A625 /* UnsignedTransaction.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UnsignedTransaction.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF2F221C361D00B3A625 /* UTXOWallet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UTXOWallet.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF34221C3A9900B3A625 /* UtxoSelectorInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoSelectorInterface.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF36221C3AAF00B3A625 /* UtxoTransactionBuilderInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoTransactionBuilderInterface.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF38221C3AC100B3A625 /* UtxoTransactionSignerInterface.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoTransactionSignerInterface.swift; sourceTree = \"<group>\"; };\n\t\t34D9CF47221C447D00B3A625 /* UtxoTransactionSigner.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UtxoTransactionSigner.swift; sourceTree = \"<group>\"; };\n\t\t6F9CF1786FD900D725E89FE5 /* Pods_HDWalletKit_HDWalletKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HDWalletKit_HDWalletKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\t96ADBA88328A4BE2159563A5 /* Pods-HDWalletKit_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-HDWalletKit_Tests.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-HDWalletKit_Tests/Pods-HDWalletKit_Tests.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tA241CE5210CEC9DFFCA47EA2 /* Pods-HDWalletKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-HDWalletKit.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-HDWalletKit/Pods-HDWalletKit.release.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tA71916E6C32DA0D7349D72D7 /* Pods_HDWalletKit.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HDWalletKit.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tBF520BDF5160D0B847AED112 /* Pods-HDWalletKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-HDWalletKit.debug.xcconfig\"; path = \"Pods/Target Support Files/Pods-HDWalletKit/Pods-HDWalletKit.debug.xcconfig\"; sourceTree = \"<group>\"; };\n\t\tD4748DCAB4A042EBDF88023E /* Pods_HDWalletKit_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_HDWalletKit_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; };\n\t\tFE9481BAD6A096D7EC0A2E49 /* Pods-HDWalletKit-HDWalletKit_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = \"Pods-HDWalletKit-HDWalletKit_Tests.release.xcconfig\"; path = \"Pods/Target Support Files/Pods-HDWalletKit-HDWalletKit_Tests/Pods-HDWalletKit-HDWalletKit_Tests.release.xcconfig\"; sourceTree = \"<group>\"; };\n/* End PBXFileReference section */\n\n/* Begin PBXFrameworksBuildPhase section */\n\t\t349220E220F64C6600A59A6F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t8602371595DB64FDBE46000C /* Pods_HDWalletKit.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t3492214420F64E0300A59A6F /* Frameworks */ = {\n\t\t\tisa = PBXFrameworksBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t345639CC226F42A500ED17DA /* CryptoSwift.framework in Frameworks */,\n\t\t\t\t3492214C20F64E0300A59A6F /* libHDWalletKit.a in Frameworks */,\n\t\t\t\t07F7F4339B91DA419CD2F41A /* Pods_HDWalletKit_HDWalletKit_Tests.framework in Frameworks */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXFrameworksBuildPhase section */\n\n/* Begin PBXGroup section */\n\t\t3437FD9B227846E5000B1527 /* BitcoinCash */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34C9B1C921E50A1700198EAF /* BitcoinCashVersionByte.swift */,\n\t\t\t\t3411D0D72279FD3E0016D0C8 /* BitcoinCashAddress.swift */,\n\t\t\t);\n\t\t\tpath = BitcoinCash;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34753F77216E76720025E0F4 /* Converter */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34753F78216E76B70025E0F4 /* WeiEthterConverter.swift */,\n\t\t\t);\n\t\t\tpath = Converter;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C10E121D642CB00295370 /* Bitcoin */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34C9B1C121E5065000198EAF /* BitcoinAddress.swift */,\n\t\t\t\t34D9CC452209CD4300B3A625 /* Transaction+SignatureHash.swift */,\n\t\t\t\t34D9CC472209CDB900B3A625 /* BitcoinTransactionSignatureSerializer.swift */,\n\t\t\t);\n\t\t\tpath = Bitcoin;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C10ED21D68F2B00295370 /* BitcoinScript */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C10EE21D68F2B00295370 /* OpCodeProtocol.swift */,\n\t\t\t\t348C10EF21D68F2B00295370 /* ScriptChunk.swift */,\n\t\t\t\t348C10F021D68F2B00295370 /* ScriptFactory.swift */,\n\t\t\t\t348C10F121D68F2B00295370 /* ScriptExecutionContext.swift */,\n\t\t\t\t348C10F221D68F2B00295370 /* ScriptChunkHelper.swift */,\n\t\t\t\t348C10F321D68F2B00295370 /* OP_CODE */,\n\t\t\t\t348C115921D68F2B00295370 /* Opcode.swift */,\n\t\t\t\t348C115A21D68F2B00295370 /* OpCodeFactory.swift */,\n\t\t\t\t348C115B21D68F2B00295370 /* Script.swift */,\n\t\t\t\t348C115C21D68F2B00295370 /* ScriptMachine.swift */,\n\t\t\t);\n\t\t\tpath = BitcoinScript;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C10F321D68F2B00295370 /* OP_CODE */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C10F421D68F2B00295370 /* Crypto */,\n\t\t\t\t348C10FF21D68F2B00295370 /* OP_EXAMPLE.swift */,\n\t\t\t\t348C110021D68F2B00295370 /* Bitwise Logic */,\n\t\t\t\t348C110921D68F2B00295370 /* Pseudo Words */,\n\t\t\t\t348C110D21D68F2B00295370 /* Arithmetic */,\n\t\t\t\t348C112921D68F2B00295370 /* Splice */,\n\t\t\t\t348C112F21D68F2B00295370 /* Reserved Words */,\n\t\t\t\t348C113121D68F2B00295370 /* Stack */,\n\t\t\t\t348C114521D68F2B00295370 /* Lock Time */,\n\t\t\t\t348C114821D68F2B00295370 /* Push Data */,\n\t\t\t\t348C114E21D68F2B00295370 /* Flow Control */,\n\t\t\t);\n\t\t\tpath = OP_CODE;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C10F421D68F2B00295370 /* Crypto */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C10F521D68F2B00295370 /* OP_SHA1.swift */,\n\t\t\t\t348C10F621D68F2B00295370 /* OP_HASH160.swift */,\n\t\t\t\t348C10F721D68F2B00295370 /* OP_SHA256.swift */,\n\t\t\t\t348C10F821D68F2B00295370 /* OP_CHECKMULTISIGVERIFY.swift */,\n\t\t\t\t348C10F921D68F2B00295370 /* OP_CHECKMULTISIG.swift */,\n\t\t\t\t348C10FA21D68F2B00295370 /* OP_CHECKSIGVERIFY.swift */,\n\t\t\t\t348C10FB21D68F2B00295370 /* OP_RIPEMD160.swift */,\n\t\t\t\t348C10FC21D68F2B00295370 /* OP_CODESEPARATOR.swift */,\n\t\t\t\t348C10FD21D68F2B00295370 /* OP_CHECKSIG.swift */,\n\t\t\t\t348C10FE21D68F2B00295370 /* OP_HASH256.swift */,\n\t\t\t);\n\t\t\tpath = Crypto;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C110021D68F2B00295370 /* Bitwise Logic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C110121D68F2B00295370 /* OP_AND.swift */,\n\t\t\t\t348C110221D68F2B00295370 /* OP_INVERT.swift */,\n\t\t\t\t348C110321D68F2B00295370 /* OP_EQUAL.swift */,\n\t\t\t\t348C110421D68F2B00295370 /* OP_RESERVED2.swift */,\n\t\t\t\t348C110521D68F2B00295370 /* OP_EQUALVERIFY.swift */,\n\t\t\t\t348C110621D68F2B00295370 /* OP_OR.swift */,\n\t\t\t\t348C110721D68F2B00295370 /* OP_XOR.swift */,\n\t\t\t\t348C110821D68F2B00295370 /* OP_RESERVED1.swift */,\n\t\t\t);\n\t\t\tpath = \"Bitwise Logic\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C110921D68F2B00295370 /* Pseudo Words */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C110A21D68F2B00295370 /* OP_PUBKEYHASH.swift */,\n\t\t\t\t348C110B21D68F2B00295370 /* OP_PUBKEY.swift */,\n\t\t\t\t348C110C21D68F2B00295370 /* OP_INVALIDOPCODE.swift */,\n\t\t\t);\n\t\t\tpath = \"Pseudo Words\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C110D21D68F2B00295370 /* Arithmetic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C110E21D68F2B00295370 /* OP_BOOLAND.swift */,\n\t\t\t\t348C110F21D68F2B00295370 /* OP_SUB.swift */,\n\t\t\t\t348C111021D68F2B00295370 /* OP_BOOLOR.swift */,\n\t\t\t\t348C111121D68F2B00295370 /* OP_RSHIFT.swift */,\n\t\t\t\t348C111221D68F2B00295370 /* OP_LSHIFT.swift */,\n\t\t\t\t348C111321D68F2B00295370 /* OP_MAX.swift */,\n\t\t\t\t348C111421D68F2B00295370 /* OP_ADD.swift */,\n\t\t\t\t348C111521D68F2B00295370 /* OP_LESSTHAN.swift */,\n\t\t\t\t348C111621D68F2B00295370 /* OP_NUMNOTEQUAL.swift */,\n\t\t\t\t348C111721D68F2B00295370 /* OP_LESSTHANOREQUAL.swift */,\n\t\t\t\t348C111821D68F2B00295370 /* OP_MOD.swift */,\n\t\t\t\t348C111921D68F2B00295370 /* OP_MUL.swift */,\n\t\t\t\t348C111A21D68F2B00295370 /* OP_DIV.swift */,\n\t\t\t\t348C111B21D68F2B00295370 /* OP_GREATERTHANOREQUAL.swift */,\n\t\t\t\t348C111C21D68F2B00295370 /* OP_NOT.swift */,\n\t\t\t\t348C111D21D68F2B00295370 /* OP_GREATERTHAN.swift */,\n\t\t\t\t348C111E21D68F2B00295370 /* OP_1ADD.swift */,\n\t\t\t\t348C111F21D68F2B00295370 /* OP_WITHIN.swift */,\n\t\t\t\t348C112021D68F2B00295370 /* OP_NEGATE.swift */,\n\t\t\t\t348C112121D68F2B00295370 /* OP_NUMEQUALVERIFY.swift */,\n\t\t\t\t348C112221D68F2B00295370 /* OP_2MUL.swift */,\n\t\t\t\t348C112321D68F2B00295370 /* OP_NUMEQUAL.swift */,\n\t\t\t\t348C112421D68F2B00295370 /* OP_MIN.swift */,\n\t\t\t\t348C112521D68F2B00295370 /* OP_ABS.swift */,\n\t\t\t\t348C112621D68F2B00295370 /* OP_2DIV.swift */,\n\t\t\t\t348C112721D68F2B00295370 /* OP_1SUB.swift */,\n\t\t\t\t348C112821D68F2B00295370 /* OP_0NOTEQUAL.swift */,\n\t\t\t);\n\t\t\tpath = Arithmetic;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C112921D68F2B00295370 /* Splice */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C112A21D68F2B00295370 /* OP_SIZE.swift */,\n\t\t\t\t348C112B21D68F2B00295370 /* OP_BIN2NUM.swift */,\n\t\t\t\t348C112C21D68F2B00295370 /* OP_CAT.swift */,\n\t\t\t\t348C112D21D68F2B00295370 /* OP_NUM2BIN.swift */,\n\t\t\t\t348C112E21D68F2B00295370 /* OP_SPLIT.swift */,\n\t\t\t);\n\t\t\tpath = Splice;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C112F21D68F2B00295370 /* Reserved Words */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C113021D68F2B00295370 /* OP_NOPN.swift */,\n\t\t\t);\n\t\t\tpath = \"Reserved Words\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C113121D68F2B00295370 /* Stack */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C113221D68F2B00295370 /* OP_2SWAP.swift */,\n\t\t\t\t348C113321D68F2B00295370 /* OP_TUCK.swift */,\n\t\t\t\t348C113421D68F2B00295370 /* OP_ROLL.swift */,\n\t\t\t\t348C113521D68F2B00295370 /* OP_SWAP.swift */,\n\t\t\t\t348C113621D68F2B00295370 /* OP_2DROP.swift */,\n\t\t\t\t348C113721D68F2B00295370 /* OP_TOTALSTACK.swift */,\n\t\t\t\t348C113821D68F2B00295370 /* OP_DROP.swift */,\n\t\t\t\t348C113921D68F2B00295370 /* OP_DEPTH.swift */,\n\t\t\t\t348C113A21D68F2B00295370 /* OP_FROMALTSTACK.swift */,\n\t\t\t\t348C113B21D68F2B00295370 /* OP_2DUP.swift */,\n\t\t\t\t348C113C21D68F2B00295370 /* OP_3DUP.swift */,\n\t\t\t\t348C113D21D68F2B00295370 /* OP_ROT.swift */,\n\t\t\t\t348C113E21D68F2B00295370 /* OP_PICK.swift */,\n\t\t\t\t348C113F21D68F2B00295370 /* OP_2OVER.swift */,\n\t\t\t\t348C114021D68F2B00295370 /* OP_NIP.swift */,\n\t\t\t\t348C114121D68F2B00295370 /* OP_IFDUP.swift */,\n\t\t\t\t348C114221D68F2B00295370 /* OP_DUP.swift */,\n\t\t\t\t348C114321D68F2B00295370 /* OP_2ROT.swift */,\n\t\t\t\t348C114421D68F2B00295370 /* OP_OVER.swift */,\n\t\t\t);\n\t\t\tpath = Stack;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C114521D68F2B00295370 /* Lock Time */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C114621D68F2B00295370 /* OP_CHECKLOCKTIMEVERIFY.swift */,\n\t\t\t\t348C114721D68F2B00295370 /* OP_CHECKSEQUENCEVERIFY.swift */,\n\t\t\t);\n\t\t\tpath = \"Lock Time\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C114821D68F2B00295370 /* Push Data */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C114921D68F2B00295370 /* OP_RESERVED.swift */,\n\t\t\t\t348C114A21D68F2B00295370 /* OP_1NEGATE.swift */,\n\t\t\t\t348C114B21D68F2B00295370 /* OP_0.swift */,\n\t\t\t\t348C114C21D68F2B00295370 /* OP_N.swift */,\n\t\t\t\t348C114D21D68F2B00295370 /* OP_PUSHDATA.swift */,\n\t\t\t);\n\t\t\tpath = \"Push Data\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C114E21D68F2B00295370 /* Flow Control */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C114F21D68F2B00295370 /* OP_VER.swift */,\n\t\t\t\t348C115021D68F2B00295370 /* OP_NOTIF.swift */,\n\t\t\t\t348C115121D68F2B00295370 /* OP_RETURN.swift */,\n\t\t\t\t348C115221D68F2B00295370 /* OP_VERIFY.swift */,\n\t\t\t\t348C115321D68F2B00295370 /* OP_IF.swift */,\n\t\t\t\t348C115421D68F2B00295370 /* OP_NOP.swift */,\n\t\t\t\t348C115521D68F2B00295370 /* OP_ELSE.swift */,\n\t\t\t\t348C115621D68F2B00295370 /* OP_VERNOTIF.swift */,\n\t\t\t\t348C115721D68F2B00295370 /* OP_VERIF.swift */,\n\t\t\t\t348C115821D68F2B00295370 /* OP_ENDIF.swift */,\n\t\t\t);\n\t\t\tpath = \"Flow Control\";\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C11C421D690DF00295370 /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34D9CF2D22199ED300B3A625 /* UnsignedTransaction.swift */,\n\t\t\t\t348C11C521D690E800295370 /* UnspendTransaction */,\n\t\t\t\t34C9B1BF21E2B3E700198EAF /* TransactionInput.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C11C521D690E800295370 /* UnspendTransaction */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C10E621D68A2600295370 /* UnspendTransaction.swift */,\n\t\t\t\t348C10E821D68A3400295370 /* TransactionOutput.swift */,\n\t\t\t\t348C10EA21D68A4100295370 /* TransactionOutPoint.swift */,\n\t\t\t);\n\t\t\tpath = UnspendTransaction;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C11C621D6919D00295370 /* AccountBased */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34A532302158E64200B95C66 /* ERC20 */,\n\t\t\t\t3492215220F6AB4F00A59A6F /* Ethereum */,\n\t\t\t);\n\t\t\tpath = AccountBased;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348C11C721D691F700295370 /* UTXOBased */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34D9CF44221C433500B3A625 /* Constants */,\n\t\t\t\t34D9CF43221C42D700B3A625 /* Default */,\n\t\t\t\t348C11C421D690DF00295370 /* Model */,\n\t\t\t\t34D9CF31221C36B200B3A625 /* Protocols */,\n\t\t\t\t3437FD9B227846E5000B1527 /* BitcoinCash */,\n\t\t\t\t348C10E121D642CB00295370 /* Bitcoin */,\n\t\t\t\t34C9B1C721E5087900198EAF /* Transaction.swift */,\n\t\t\t\t34D9CF2F221C361D00B3A625 /* UTXOWallet.swift */,\n\t\t\t\t345B813122675002000E3460 /* UtxoPrivateKeyType.swift */,\n\t\t\t);\n\t\t\tpath = UTXOBased;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t348FA3BD224A4F6E00DA3F1B /* UTXO */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348FA3BB224A4C9D00DA3F1B /* UTXOSign.swift */,\n\t\t\t);\n\t\t\tpath = UTXO;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t349220DC20F64C6600A59A6F = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492211920F64D9B00A59A6F /* HDWalletKit */,\n\t\t\t\t3492214820F64E0300A59A6F /* HDWalletKit_Tests */,\n\t\t\t\t349220E620F64C6600A59A6F /* Products */,\n\t\t\t\t77307DFD3336DD82DE6F1509 /* Pods */,\n\t\t\t\t4C50FFAFC17638B67FA3B603 /* Frameworks */,\n\t\t\t);\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t349220E620F64C6600A59A6F /* Products */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t349220E520F64C6600A59A6F /* libHDWalletKit.a */,\n\t\t\t\t3492214720F64E0300A59A6F /* HDWalletKit_Tests.xctest */,\n\t\t\t);\n\t\t\tname = Products;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492211920F64D9B00A59A6F /* HDWalletKit */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B7964821282BD4000B1251 /* Keystore */,\n\t\t\t\t3492211A20F64D9B00A59A6F /* Core */,\n\t\t\t\t3492212920F64D9B00A59A6F /* Mnemonic */,\n\t\t\t\t3492212C20F64D9B00A59A6F /* Models */,\n\t\t\t\t3492212E20F64D9B00A59A6F /* Wallet */,\n\t\t\t);\n\t\t\tpath = HDWalletKit;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492211A20F64D9B00A59A6F /* Core */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C10ED21D68F2B00295370 /* BitcoinScript */,\n\t\t\t\t34753F77216E76720025E0F4 /* Converter */,\n\t\t\t\t34B7B85520F7847000D2C34A /* Extensions */,\n\t\t\t\t3492216720F7464700A59A6F /* Error */,\n\t\t\t\t3492211B20F64D9B00A59A6F /* BigInt */,\n\t\t\t\t3492211E20F64D9B00A59A6F /* Crypto */,\n\t\t\t\t3492212420F64D9B00A59A6F /* DataConvertable.swift */,\n\t\t\t\t3492212520F64D9B00A59A6F /* DerivationNode.swift */,\n\t\t\t\t3492212620F64D9B00A59A6F /* Encodeing */,\n\t\t\t\t3492216120F6B53300A59A6F /* Typealiaces.swift */,\n\t\t\t\t34C9B1B721E2B06300198EAF /* ByteStream.swift */,\n\t\t\t\t34C9B1B921E2B09500198EAF /* VarInt.swift */,\n\t\t\t\t34C9B1BB21E2B0D400198EAF /* VarString.swift */,\n\t\t\t);\n\t\t\tpath = Core;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492211B20F64D9B00A59A6F /* BigInt */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492211C20F64D9B00A59A6F /* BigInt+Extension.swift */,\n\t\t\t\t3492211D20F64D9B00A59A6F /* SMP.swift */,\n\t\t\t\t34C9B1B521E2AE6700198EAF /* BigNumber.swift */,\n\t\t\t);\n\t\t\tpath = BigInt;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492211E20F64D9B00A59A6F /* Crypto */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492211F20F64D9B00A59A6F /* Encryption */,\n\t\t\t\t3492212220F64D9B00A59A6F /* Hash */,\n\t\t\t);\n\t\t\tpath = Crypto;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492211F20F64D9B00A59A6F /* Encryption */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492216320F6B79300A59A6F /* EIP155Signer.swift */,\n\t\t\t\t3492212020F64D9B00A59A6F /* Crypto.swift */,\n\t\t\t\t3492212120F64D9B00A59A6F /* ECDSA.swift */,\n\t\t\t\t3492216A20F747EC00A59A6F /* EllipticCurveEncrypterSecp256k1.swift */,\n\t\t\t\t3401AF6D20F908AA006DEF49 /* SecpResult.swift */,\n\t\t\t);\n\t\t\tpath = Encryption;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492212220F64D9B00A59A6F /* Hash */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492212320F64D9B00A59A6F /* RIPEMD160.swift */,\n\t\t\t);\n\t\t\tpath = Hash;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492212620F64D9B00A59A6F /* Encodeing */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492216420F6B79400A59A6F /* RLP.swift */,\n\t\t\t\t3492212720F64D9B00A59A6F /* Base58Encode.swift */,\n\t\t\t\t3492212820F64D9B00A59A6F /* EIP55.swift */,\n\t\t\t\t34D9CC432209BFAF00B3A625 /* Bech32.swift */,\n\t\t\t);\n\t\t\tpath = Encodeing;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492212920F64D9B00A59A6F /* Mnemonic */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492212A20F64D9B00A59A6F /* Mnemonic.swift */,\n\t\t\t\t3492212B20F64D9B00A59A6F /* WordList.swift */,\n\t\t\t);\n\t\t\tpath = Mnemonic;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492212C20F64D9B00A59A6F /* Models */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492212D20F64D9B00A59A6F /* Account.swift */,\n\t\t\t);\n\t\t\tpath = Models;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492212E20F64D9B00A59A6F /* Wallet */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348C11C721D691F700295370 /* UTXOBased */,\n\t\t\t\t348C11C621D6919D00295370 /* AccountBased */,\n\t\t\t\t3492213020F64D9B00A59A6F /* PrivateKey.swift */,\n\t\t\t\t3492213220F64D9B00A59A6F /* Wallet.swift */,\n\t\t\t\t3411AEE62164278A00AB9476 /* Coin.swift */,\n\t\t\t\t3411AF0921656F0700AB9476 /* PublicKey.swift */,\n\t\t\t);\n\t\t\tpath = Wallet;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492214820F64E0300A59A6F /* HDWalletKit_Tests */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t348FA3BD224A4F6E00DA3F1B /* UTXO */,\n\t\t\t\t34B7B84E20F75DBF00D2C34A /* MnemonicTests.swift */,\n\t\t\t\t34B7B85020F75E4E00D2C34A /* CryptoTests.swift */,\n\t\t\t\t34B7B85220F75E5B00D2C34A /* AddressGenerationTests.swift */,\n\t\t\t\t3492214B20F64E0300A59A6F /* Info.plist */,\n\t\t\t\t344167EB212CC100008B8A91 /* KeystoreTests.swift */,\n\t\t\t\t34A5322D215307DF00B95C66 /* SignTransactionTests.swift */,\n\t\t\t\t34A532332158E96C00B95C66 /* ERC20Tests.swift */,\n\t\t\t\t34753F7A216E78430025E0F4 /* ConverterTests.swift */,\n\t\t\t\t345639C9226F0CF000ED17DA /* RIPEMD160Tests.swift */,\n\t\t\t\t345639CF226F58BD00ED17DA /* Secp256k1Tets.swift */,\n\t\t\t\t345B81332268A649000E3460 /* PrivateKeyTests.swift */,\n\t\t\t\t342233B9227E7B7600C89968 /* ImportWalletTests.swift */,\n\t\t\t);\n\t\t\tpath = HDWalletKit_Tests;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492215220F6AB4F00A59A6F /* Ethereum */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492215320F6B4B400A59A6F /* Model */,\n\t\t\t);\n\t\t\tpath = Ethereum;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492215320F6B4B400A59A6F /* Model */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3401AEF920F797CB006DEF49 /* EthereumAddress.swift */,\n\t\t\t\t3492215720F6B4B400A59A6F /* EthereumRawTransaction.swift */,\n\t\t\t);\n\t\t\tpath = Model;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t3492216720F7464700A59A6F /* Error */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t3492216820F7466800A59A6F /* HDWalletKitError.swift */,\n\t\t\t);\n\t\t\tpath = Error;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34A532302158E64200B95C66 /* ERC20 */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34A532312158E66900B95C66 /* ERC20.swift */,\n\t\t\t);\n\t\t\tpath = ERC20;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34B7964821282BD4000B1251 /* Keystore */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B7964921296427000B1251 /* KeystoreV3Json.swift */,\n\t\t\t\t34B7964B212A881C000B1251 /* KeystoreInterface.swift */,\n\t\t\t\t34B7964D212A93A0000B1251 /* KeystoreV3.swift */,\n\t\t\t);\n\t\t\tpath = Keystore;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34B7B85520F7847000D2C34A /* Extensions */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34B7B85620F7848D00D2C34A /* String+Hex.swift */,\n\t\t\t\t34B7964F212A95D5000B1251 /* Data+Random.swift */,\n\t\t\t\t348C11C821DFDB9400295370 /* Data+Script.swift */,\n\t\t\t);\n\t\t\tpath = Extensions;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34D9CF31221C36B200B3A625 /* Protocols */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34D9CF34221C3A9900B3A625 /* UtxoSelectorInterface.swift */,\n\t\t\t\t34D9CF36221C3AAF00B3A625 /* UtxoTransactionBuilderInterface.swift */,\n\t\t\t\t34D9CF38221C3AC100B3A625 /* UtxoTransactionSignerInterface.swift */,\n\t\t\t);\n\t\t\tpath = Protocols;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34D9CF43221C42D700B3A625 /* Default */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34D9CF2B22199E6000B3A625 /* UtxoTransactionBuilder.swift */,\n\t\t\t\t34D9CC492212FE9D00B3A625 /* UtxoSelector.swift */,\n\t\t\t\t34D9CF47221C447D00B3A625 /* UtxoTransactionSigner.swift */,\n\t\t\t);\n\t\t\tpath = Default;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t34D9CF44221C433500B3A625 /* Constants */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t34C9B1BD21E2B38B00198EAF /* SighashType.swift */,\n\t\t\t\t348C11CA21E1675B00295370 /* UtilsAndLimits.swift */,\n\t\t\t);\n\t\t\tpath = Constants;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t4C50FFAFC17638B67FA3B603 /* Frameworks */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\t345639CD226F42BC00ED17DA /* CryptoSwift.framework */,\n\t\t\t\t345639CB226F42A500ED17DA /* CryptoSwift.framework */,\n\t\t\t\tA71916E6C32DA0D7349D72D7 /* Pods_HDWalletKit.framework */,\n\t\t\t\tD4748DCAB4A042EBDF88023E /* Pods_HDWalletKit_Tests.framework */,\n\t\t\t\t6F9CF1786FD900D725E89FE5 /* Pods_HDWalletKit_HDWalletKit_Tests.framework */,\n\t\t\t);\n\t\t\tname = Frameworks;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n\t\t77307DFD3336DD82DE6F1509 /* Pods */ = {\n\t\t\tisa = PBXGroup;\n\t\t\tchildren = (\n\t\t\t\tBF520BDF5160D0B847AED112 /* Pods-HDWalletKit.debug.xcconfig */,\n\t\t\t\tA241CE5210CEC9DFFCA47EA2 /* Pods-HDWalletKit.release.xcconfig */,\n\t\t\t\t96ADBA88328A4BE2159563A5 /* Pods-HDWalletKit_Tests.debug.xcconfig */,\n\t\t\t\t29695349E80AB7F880E24B02 /* Pods-HDWalletKit_Tests.release.xcconfig */,\n\t\t\t\t24463252CD56603F58800D8F /* Pods-HDWalletKit-HDWalletKit_Tests.debug.xcconfig */,\n\t\t\t\tFE9481BAD6A096D7EC0A2E49 /* Pods-HDWalletKit-HDWalletKit_Tests.release.xcconfig */,\n\t\t\t);\n\t\t\tname = Pods;\n\t\t\tsourceTree = \"<group>\";\n\t\t};\n/* End PBXGroup section */\n\n/* Begin PBXNativeTarget section */\n\t\t349220E420F64C6600A59A6F /* HDWalletKit */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 349220EC20F64C6600A59A6F /* Build configuration list for PBXNativeTarget \"HDWalletKit\" */;\n\t\t\tbuildPhases = (\n\t\t\t\t4B8D9FC1EAB0A374CC6823B3 /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t349220E120F64C6600A59A6F /* Sources */,\n\t\t\t\t349220E220F64C6600A59A6F /* Frameworks */,\n\t\t\t\t349220E320F64C6600A59A6F /* CopyFiles */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t);\n\t\t\tname = HDWalletKit;\n\t\t\tproductName = HDWalletKit;\n\t\t\tproductReference = 349220E520F64C6600A59A6F /* libHDWalletKit.a */;\n\t\t\tproductType = \"com.apple.product-type.library.static\";\n\t\t};\n\t\t3492214620F64E0300A59A6F /* HDWalletKit_Tests */ = {\n\t\t\tisa = PBXNativeTarget;\n\t\t\tbuildConfigurationList = 3492215120F64E0300A59A6F /* Build configuration list for PBXNativeTarget \"HDWalletKit_Tests\" */;\n\t\t\tbuildPhases = (\n\t\t\t\tA910BFEB3CDFE869EFBB423E /* [CP] Check Pods Manifest.lock */,\n\t\t\t\t3492214320F64E0300A59A6F /* Sources */,\n\t\t\t\t3492214420F64E0300A59A6F /* Frameworks */,\n\t\t\t\t3492214520F64E0300A59A6F /* Resources */,\n\t\t\t\t2D0545F275338FE57938BA97 /* [CP] Embed Pods Frameworks */,\n\t\t\t);\n\t\t\tbuildRules = (\n\t\t\t);\n\t\t\tdependencies = (\n\t\t\t\t3492214E20F64E0300A59A6F /* PBXTargetDependency */,\n\t\t\t);\n\t\t\tname = HDWalletKit_Tests;\n\t\t\tproductName = HDWalletKit_Tests;\n\t\t\tproductReference = 3492214720F64E0300A59A6F /* HDWalletKit_Tests.xctest */;\n\t\t\tproductType = \"com.apple.product-type.bundle.unit-test\";\n\t\t};\n/* End PBXNativeTarget section */\n\n/* Begin PBXProject section */\n\t\t349220DD20F64C6600A59A6F /* Project object */ = {\n\t\t\tisa = PBXProject;\n\t\t\tattributes = {\n\t\t\t\tLastSwiftUpdateCheck = 0940;\n\t\t\t\tLastUpgradeCheck = 0940;\n\t\t\t\tORGANIZATIONNAME = Essentia;\n\t\t\t\tTargetAttributes = {\n\t\t\t\t\t349220E420F64C6600A59A6F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t\t3492214620F64E0300A59A6F = {\n\t\t\t\t\t\tCreatedOnToolsVersion = 9.4.1;\n\t\t\t\t\t\tLastSwiftMigration = 1020;\n\t\t\t\t\t};\n\t\t\t\t};\n\t\t\t};\n\t\t\tbuildConfigurationList = 349220E020F64C6600A59A6F /* Build configuration list for PBXProject \"HDWalletKit\" */;\n\t\t\tcompatibilityVersion = \"Xcode 9.3\";\n\t\t\tdevelopmentRegion = en;\n\t\t\thasScannedForEncodings = 0;\n\t\t\tknownRegions = (\n\t\t\t\ten,\n\t\t\t\tBase,\n\t\t\t);\n\t\t\tmainGroup = 349220DC20F64C6600A59A6F;\n\t\t\tproductRefGroup = 349220E620F64C6600A59A6F /* Products */;\n\t\t\tprojectDirPath = \"\";\n\t\t\tprojectRoot = \"\";\n\t\t\ttargets = (\n\t\t\t\t349220E420F64C6600A59A6F /* HDWalletKit */,\n\t\t\t\t3492214620F64E0300A59A6F /* HDWalletKit_Tests */,\n\t\t\t);\n\t\t};\n/* End PBXProject section */\n\n/* Begin PBXResourcesBuildPhase section */\n\t\t3492214520F64E0300A59A6F /* Resources */ = {\n\t\t\tisa = PBXResourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXResourcesBuildPhase section */\n\n/* Begin PBXShellScriptBuildPhase section */\n\t\t2D0545F275338FE57938BA97 /* [CP] Embed Pods Frameworks */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-HDWalletKit-HDWalletKit_Tests/Pods-HDWalletKit-HDWalletKit_Tests-frameworks-${CONFIGURATION}-input-files.xcfilelist\",\n\t\t\t);\n\t\t\tname = \"[CP] Embed Pods Frameworks\";\n\t\t\toutputFileListPaths = (\n\t\t\t\t\"${PODS_ROOT}/Target Support Files/Pods-HDWalletKit-HDWalletKit_Tests/Pods-HDWalletKit-HDWalletKit_Tests-frameworks-${CONFIGURATION}-output-files.xcfilelist\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"\\\"${PODS_ROOT}/Target Support Files/Pods-HDWalletKit-HDWalletKit_Tests/Pods-HDWalletKit-HDWalletKit_Tests-frameworks.sh\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\t4B8D9FC1EAB0A374CC6823B3 /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-HDWalletKit-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n\t\tA910BFEB3CDFE869EFBB423E /* [CP] Check Pods Manifest.lock */ = {\n\t\t\tisa = PBXShellScriptBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t);\n\t\t\tinputFileListPaths = (\n\t\t\t);\n\t\t\tinputPaths = (\n\t\t\t\t\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\",\n\t\t\t\t\"${PODS_ROOT}/Manifest.lock\",\n\t\t\t);\n\t\t\tname = \"[CP] Check Pods Manifest.lock\";\n\t\t\toutputFileListPaths = (\n\t\t\t);\n\t\t\toutputPaths = (\n\t\t\t\t\"$(DERIVED_FILE_DIR)/Pods-HDWalletKit-HDWalletKit_Tests-checkManifestLockResult.txt\",\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t\tshellPath = /bin/sh;\n\t\t\tshellScript = \"diff \\\"${PODS_PODFILE_DIR_PATH}/Podfile.lock\\\" \\\"${PODS_ROOT}/Manifest.lock\\\" > /dev/null\\nif [ $? != 0 ] ; then\\n    # print error to STDERR\\n    echo \\\"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\\\" >&2\\n    exit 1\\nfi\\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\\necho \\\"SUCCESS\\\" > \\\"${SCRIPT_OUTPUT_FILE_0}\\\"\\n\";\n\t\t\tshowEnvVarsInLog = 0;\n\t\t};\n/* End PBXShellScriptBuildPhase section */\n\n/* Begin PBXSourcesBuildPhase section */\n\t\t349220E120F64C6600A59A6F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t348C116321D68F2B00295370 /* OP_HASH160.swift in Sources */,\n\t\t\t\t34B7B84D20F7572900D2C34A /* HDWalletKitError.swift in Sources */,\n\t\t\t\t348C11B621D68F2C00295370 /* OP_VERIFY.swift in Sources */,\n\t\t\t\t348C118121D68F2B00295370 /* OP_LESSTHANOREQUAL.swift in Sources */,\n\t\t\t\t348C117021D68F2B00295370 /* OP_RESERVED2.swift in Sources */,\n\t\t\t\t3492216220F6B53300A59A6F /* Typealiaces.swift in Sources */,\n\t\t\t\t348C117F21D68F2B00295370 /* OP_LESSTHAN.swift in Sources */,\n\t\t\t\t34B7964A21296427000B1251 /* KeystoreV3Json.swift in Sources */,\n\t\t\t\t348C115F21D68F2B00295370 /* ScriptFactory.swift in Sources */,\n\t\t\t\t34C9B1BE21E2B38B00198EAF /* SighashType.swift in Sources */,\n\t\t\t\t348C116921D68F2B00295370 /* OP_CODESEPARATOR.swift in Sources */,\n\t\t\t\t3492214220F64D9B00A59A6F /* Wallet.swift in Sources */,\n\t\t\t\t348C11AA21D68F2C00295370 /* OP_2ROT.swift in Sources */,\n\t\t\t\t34B7964C212A881C000B1251 /* KeystoreInterface.swift in Sources */,\n\t\t\t\t348C11B821D68F2C00295370 /* OP_NOP.swift in Sources */,\n\t\t\t\t3492216520F6B79400A59A6F /* EIP155Signer.swift in Sources */,\n\t\t\t\t348C118521D68F2B00295370 /* OP_GREATERTHANOREQUAL.swift in Sources */,\n\t\t\t\t348C11BC21D68F2C00295370 /* OP_ENDIF.swift in Sources */,\n\t\t\t\t348C11AF21D68F2C00295370 /* OP_1NEGATE.swift in Sources */,\n\t\t\t\t348C11BA21D68F2C00295370 /* OP_VERNOTIF.swift in Sources */,\n\t\t\t\t3492213B20F64D9B00A59A6F /* EIP55.swift in Sources */,\n\t\t\t\t348C11B021D68F2C00295370 /* OP_0.swift in Sources */,\n\t\t\t\t348C11A621D68F2C00295370 /* OP_2OVER.swift in Sources */,\n\t\t\t\t348C118D21D68F2B00295370 /* OP_NUMEQUAL.swift in Sources */,\n\t\t\t\t348C11AC21D68F2C00295370 /* OP_CHECKLOCKTIMEVERIFY.swift in Sources */,\n\t\t\t\t34D9CC4A2212FE9D00B3A625 /* UtxoSelector.swift in Sources */,\n\t\t\t\t348C119221D68F2C00295370 /* OP_0NOTEQUAL.swift in Sources */,\n\t\t\t\t3401AEFA20F797CB006DEF49 /* EthereumAddress.swift in Sources */,\n\t\t\t\t3492215D20F6B4B600A59A6F /* EthereumRawTransaction.swift in Sources */,\n\t\t\t\t348C119921D68F2C00295370 /* OP_2SWAP.swift in Sources */,\n\t\t\t\t348C119F21D68F2C00295370 /* OP_DROP.swift in Sources */,\n\t\t\t\t348C11C021D68F2C00295370 /* ScriptMachine.swift in Sources */,\n\t\t\t\t348C119E21D68F2C00295370 /* OP_TOTALSTACK.swift in Sources */,\n\t\t\t\t348C115D21D68F2B00295370 /* OpCodeProtocol.swift in Sources */,\n\t\t\t\t3492213D20F64D9B00A59A6F /* WordList.swift in Sources */,\n\t\t\t\t348C118721D68F2B00295370 /* OP_GREATERTHAN.swift in Sources */,\n\t\t\t\t3411AF0A21656F0700AB9476 /* PublicKey.swift in Sources */,\n\t\t\t\t348C10E721D68A2600295370 /* UnspendTransaction.swift in Sources */,\n\t\t\t\t348C116621D68F2B00295370 /* OP_CHECKMULTISIG.swift in Sources */,\n\t\t\t\t348C118821D68F2B00295370 /* OP_1ADD.swift in Sources */,\n\t\t\t\t348C11AB21D68F2C00295370 /* OP_OVER.swift in Sources */,\n\t\t\t\t348C119621D68F2C00295370 /* OP_NUM2BIN.swift in Sources */,\n\t\t\t\t348C11B121D68F2C00295370 /* OP_N.swift in Sources */,\n\t\t\t\t348C116221D68F2B00295370 /* OP_SHA1.swift in Sources */,\n\t\t\t\t348C119821D68F2C00295370 /* OP_NOPN.swift in Sources */,\n\t\t\t\t348C116B21D68F2B00295370 /* OP_HASH256.swift in Sources */,\n\t\t\t\t34B7B85720F7848D00D2C34A /* String+Hex.swift in Sources */,\n\t\t\t\t348C118F21D68F2B00295370 /* OP_ABS.swift in Sources */,\n\t\t\t\t348C118E21D68F2B00295370 /* OP_MIN.swift in Sources */,\n\t\t\t\t348C117C21D68F2B00295370 /* OP_LSHIFT.swift in Sources */,\n\t\t\t\t348C11AE21D68F2C00295370 /* OP_RESERVED.swift in Sources */,\n\t\t\t\t3492213720F64D9B00A59A6F /* RIPEMD160.swift in Sources */,\n\t\t\t\t3492213920F64D9B00A59A6F /* DerivationNode.swift in Sources */,\n\t\t\t\t348C117E21D68F2B00295370 /* OP_ADD.swift in Sources */,\n\t\t\t\t3401AF6E20F908AA006DEF49 /* SecpResult.swift in Sources */,\n\t\t\t\t348C119C21D68F2C00295370 /* OP_SWAP.swift in Sources */,\n\t\t\t\t34C9B1CA21E50A1700198EAF /* BitcoinCashVersionByte.swift in Sources */,\n\t\t\t\t348C117A21D68F2B00295370 /* OP_BOOLOR.swift in Sources */,\n\t\t\t\t348C11A321D68F2C00295370 /* OP_3DUP.swift in Sources */,\n\t\t\t\t348C116121D68F2B00295370 /* ScriptChunkHelper.swift in Sources */,\n\t\t\t\t348C116721D68F2B00295370 /* OP_CHECKSIGVERIFY.swift in Sources */,\n\t\t\t\t348C11B421D68F2C00295370 /* OP_NOTIF.swift in Sources */,\n\t\t\t\t3492213820F64D9B00A59A6F /* DataConvertable.swift in Sources */,\n\t\t\t\t348C11B321D68F2C00295370 /* OP_VER.swift in Sources */,\n\t\t\t\t348C11A021D68F2C00295370 /* OP_DEPTH.swift in Sources */,\n\t\t\t\t348C11A221D68F2C00295370 /* OP_2DUP.swift in Sources */,\n\t\t\t\t34D9CF2E22199ED300B3A625 /* UnsignedTransaction.swift in Sources */,\n\t\t\t\t3492213E20F64D9B00A59A6F /* Account.swift in Sources */,\n\t\t\t\t348C119D21D68F2C00295370 /* OP_2DROP.swift in Sources */,\n\t\t\t\t348C117321D68F2B00295370 /* OP_XOR.swift in Sources */,\n\t\t\t\t348C116A21D68F2B00295370 /* OP_CHECKSIG.swift in Sources */,\n\t\t\t\t34B79650212A95D5000B1251 /* Data+Random.swift in Sources */,\n\t\t\t\t3411D0D82279FD3E0016D0C8 /* BitcoinCashAddress.swift in Sources */,\n\t\t\t\t348C119321D68F2C00295370 /* OP_SIZE.swift in Sources */,\n\t\t\t\t348C117621D68F2B00295370 /* OP_PUBKEY.swift in Sources */,\n\t\t\t\t348C118421D68F2B00295370 /* OP_DIV.swift in Sources */,\n\t\t\t\t348C116F21D68F2B00295370 /* OP_EQUAL.swift in Sources */,\n\t\t\t\t348C11A721D68F2C00295370 /* OP_NIP.swift in Sources */,\n\t\t\t\t348C11A121D68F2C00295370 /* OP_FROMALTSTACK.swift in Sources */,\n\t\t\t\t348C117521D68F2B00295370 /* OP_PUBKEYHASH.swift in Sources */,\n\t\t\t\t348C118221D68F2B00295370 /* OP_MOD.swift in Sources */,\n\t\t\t\t3411AEE72164278A00AB9476 /* Coin.swift in Sources */,\n\t\t\t\t348C119B21D68F2C00295370 /* OP_ROLL.swift in Sources */,\n\t\t\t\t348C118921D68F2B00295370 /* OP_WITHIN.swift in Sources */,\n\t\t\t\t348C11BB21D68F2C00295370 /* OP_VERIF.swift in Sources */,\n\t\t\t\t348C11BD21D68F2C00295370 /* Opcode.swift in Sources */,\n\t\t\t\t34C9B1BA21E2B09500198EAF /* VarInt.swift in Sources */,\n\t\t\t\t34D9CF2C22199E6000B3A625 /* UtxoTransactionBuilder.swift in Sources */,\n\t\t\t\t348C11A521D68F2C00295370 /* OP_PICK.swift in Sources */,\n\t\t\t\t348C118021D68F2B00295370 /* OP_NUMNOTEQUAL.swift in Sources */,\n\t\t\t\t34C9B1C021E2B3E700198EAF /* TransactionInput.swift in Sources */,\n\t\t\t\t34C9B1B621E2AE6700198EAF /* BigNumber.swift in Sources */,\n\t\t\t\t3492213A20F64D9B00A59A6F /* Base58Encode.swift in Sources */,\n\t\t\t\t34D9CC442209BFAF00B3A625 /* Bech32.swift in Sources */,\n\t\t\t\t345B813222675002000E3460 /* UtxoPrivateKeyType.swift in Sources */,\n\t\t\t\t34D9CF39221C3AC100B3A625 /* UtxoTransactionSignerInterface.swift in Sources */,\n\t\t\t\t3492213520F64D9B00A59A6F /* Crypto.swift in Sources */,\n\t\t\t\t34A532322158E66900B95C66 /* ERC20.swift in Sources */,\n\t\t\t\t348C117221D68F2B00295370 /* OP_OR.swift in Sources */,\n\t\t\t\t348C118B21D68F2B00295370 /* OP_NUMEQUALVERIFY.swift in Sources */,\n\t\t\t\t348C119121D68F2C00295370 /* OP_1SUB.swift in Sources */,\n\t\t\t\t348C116421D68F2B00295370 /* OP_SHA256.swift in Sources */,\n\t\t\t\t348C11A421D68F2C00295370 /* OP_ROT.swift in Sources */,\n\t\t\t\t348C11BF21D68F2C00295370 /* Script.swift in Sources */,\n\t\t\t\t3492216B20F747EC00A59A6F /* EllipticCurveEncrypterSecp256k1.swift in Sources */,\n\t\t\t\t3492213420F64D9B00A59A6F /* SMP.swift in Sources */,\n\t\t\t\t3492216620F6B79400A59A6F /* RLP.swift in Sources */,\n\t\t\t\t348C11B221D68F2C00295370 /* OP_PUSHDATA.swift in Sources */,\n\t\t\t\t34C9B1C221E5065000198EAF /* BitcoinAddress.swift in Sources */,\n\t\t\t\t348C117921D68F2B00295370 /* OP_SUB.swift in Sources */,\n\t\t\t\t348C116521D68F2B00295370 /* OP_CHECKMULTISIGVERIFY.swift in Sources */,\n\t\t\t\t3492213620F64D9B00A59A6F /* ECDSA.swift in Sources */,\n\t\t\t\t34753F79216E76B70025E0F4 /* WeiEthterConverter.swift in Sources */,\n\t\t\t\t348C11BE21D68F2C00295370 /* OpCodeFactory.swift in Sources */,\n\t\t\t\t348C119A21D68F2C00295370 /* OP_TUCK.swift in Sources */,\n\t\t\t\t348C117721D68F2B00295370 /* OP_INVALIDOPCODE.swift in Sources */,\n\t\t\t\t348C10EB21D68A4100295370 /* TransactionOutPoint.swift in Sources */,\n\t\t\t\t348C117421D68F2B00295370 /* OP_RESERVED1.swift in Sources */,\n\t\t\t\t34C9B1B821E2B06300198EAF /* ByteStream.swift in Sources */,\n\t\t\t\t348C118621D68F2B00295370 /* OP_NOT.swift in Sources */,\n\t\t\t\t348C11B921D68F2C00295370 /* OP_ELSE.swift in Sources */,\n\t\t\t\t348C11A821D68F2C00295370 /* OP_IFDUP.swift in Sources */,\n\t\t\t\t348C11AD21D68F2C00295370 /* OP_CHECKSEQUENCEVERIFY.swift in Sources */,\n\t\t\t\t3492213320F64D9B00A59A6F /* BigInt+Extension.swift in Sources */,\n\t\t\t\t348C119021D68F2B00295370 /* OP_2DIV.swift in Sources */,\n\t\t\t\t348C117121D68F2B00295370 /* OP_EQUALVERIFY.swift in Sources */,\n\t\t\t\t34D9CF30221C361D00B3A625 /* UTXOWallet.swift in Sources */,\n\t\t\t\t34D9CF35221C3A9900B3A625 /* UtxoSelectorInterface.swift in Sources */,\n\t\t\t\t348C11CB21E1675B00295370 /* UtilsAndLimits.swift in Sources */,\n\t\t\t\t34D9CF48221C447D00B3A625 /* UtxoTransactionSigner.swift in Sources */,\n\t\t\t\t348C11B521D68F2C00295370 /* OP_RETURN.swift in Sources */,\n\t\t\t\t348C119521D68F2C00295370 /* OP_CAT.swift in Sources */,\n\t\t\t\t348C116D21D68F2B00295370 /* OP_AND.swift in Sources */,\n\t\t\t\t348C116821D68F2B00295370 /* OP_RIPEMD160.swift in Sources */,\n\t\t\t\t348C118321D68F2B00295370 /* OP_MUL.swift in Sources */,\n\t\t\t\t34D9CC462209CD4300B3A625 /* Transaction+SignatureHash.swift in Sources */,\n\t\t\t\t348C115E21D68F2B00295370 /* ScriptChunk.swift in Sources */,\n\t\t\t\t348C117D21D68F2B00295370 /* OP_MAX.swift in Sources */,\n\t\t\t\t34C9B1C821E5087900198EAF /* Transaction.swift in Sources */,\n\t\t\t\t3492213C20F64D9B00A59A6F /* Mnemonic.swift in Sources */,\n\t\t\t\t348C119721D68F2C00295370 /* OP_SPLIT.swift in Sources */,\n\t\t\t\t348C119421D68F2C00295370 /* OP_BIN2NUM.swift in Sources */,\n\t\t\t\t34D9CC482209CDB900B3A625 /* BitcoinTransactionSignatureSerializer.swift in Sources */,\n\t\t\t\t348C11B721D68F2C00295370 /* OP_IF.swift in Sources */,\n\t\t\t\t348C11A921D68F2C00295370 /* OP_DUP.swift in Sources */,\n\t\t\t\t348C10E921D68A3400295370 /* TransactionOutput.swift in Sources */,\n\t\t\t\t348C117821D68F2B00295370 /* OP_BOOLAND.swift in Sources */,\n\t\t\t\t348C116C21D68F2B00295370 /* OP_EXAMPLE.swift in Sources */,\n\t\t\t\t348C11C921DFDB9400295370 /* Data+Script.swift in Sources */,\n\t\t\t\t348C116E21D68F2B00295370 /* OP_INVERT.swift in Sources */,\n\t\t\t\t348C117B21D68F2B00295370 /* OP_RSHIFT.swift in Sources */,\n\t\t\t\t34C9B1BC21E2B0D400198EAF /* VarString.swift in Sources */,\n\t\t\t\t34B7964E212A93A0000B1251 /* KeystoreV3.swift in Sources */,\n\t\t\t\t348C118C21D68F2B00295370 /* OP_2MUL.swift in Sources */,\n\t\t\t\t34D9CF37221C3AAF00B3A625 /* UtxoTransactionBuilderInterface.swift in Sources */,\n\t\t\t\t3492214020F64D9B00A59A6F /* PrivateKey.swift in Sources */,\n\t\t\t\t348C116021D68F2B00295370 /* ScriptExecutionContext.swift in Sources */,\n\t\t\t\t348C118A21D68F2B00295370 /* OP_NEGATE.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n\t\t3492214320F64E0300A59A6F /* Sources */ = {\n\t\t\tisa = PBXSourcesBuildPhase;\n\t\t\tbuildActionMask = 2147483647;\n\t\t\tfiles = (\n\t\t\t\t34A5322E215307DF00B95C66 /* SignTransactionTests.swift in Sources */,\n\t\t\t\t34B7B85320F75E5B00D2C34A /* AddressGenerationTests.swift in Sources */,\n\t\t\t\t345639CA226F0CF000ED17DA /* RIPEMD160Tests.swift in Sources */,\n\t\t\t\t348FA3BC224A4C9D00DA3F1B /* UTXOSign.swift in Sources */,\n\t\t\t\t34B7B85120F75E4E00D2C34A /* CryptoTests.swift in Sources */,\n\t\t\t\t342233BA227E7B7600C89968 /* ImportWalletTests.swift in Sources */,\n\t\t\t\t34B7B84F20F75DBF00D2C34A /* MnemonicTests.swift in Sources */,\n\t\t\t\t34753F7B216E78430025E0F4 /* ConverterTests.swift in Sources */,\n\t\t\t\t34A532342158E96C00B95C66 /* ERC20Tests.swift in Sources */,\n\t\t\t\t345639D0226F58BD00ED17DA /* Secp256k1Tets.swift in Sources */,\n\t\t\t\t344167EC212CC100008B8A91 /* KeystoreTests.swift in Sources */,\n\t\t\t\t345B81342268A649000E3460 /* PrivateKeyTests.swift in Sources */,\n\t\t\t);\n\t\t\trunOnlyForDeploymentPostprocessing = 0;\n\t\t};\n/* End PBXSourcesBuildPhase section */\n\n/* Begin PBXTargetDependency section */\n\t\t3492214E20F64E0300A59A6F /* PBXTargetDependency */ = {\n\t\t\tisa = PBXTargetDependency;\n\t\t\ttarget = 349220E420F64C6600A59A6F /* HDWalletKit */;\n\t\t\ttargetProxy = 3492214D20F64E0300A59A6F /* PBXContainerItemProxy */;\n\t\t};\n/* End PBXTargetDependency section */\n\n/* Begin XCBuildConfiguration section */\n\t\t349220EA20F64C6600A59A6F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = dwarf;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tENABLE_TESTABILITY = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_DYNAMIC_NO_PIC = NO;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_OPTIMIZATION_LEVEL = 0;\n\t\t\t\tGCC_PREPROCESSOR_DEFINITIONS = (\n\t\t\t\t\t\"DEBUG=1\",\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t);\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = YES;\n\t\t\t\tONLY_ACTIVE_ARCH = YES;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-Onone\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t349220EB20F64C6600A59A6F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbuildSettings = {\n\t\t\t\tALWAYS_SEARCH_USER_PATHS = NO;\n\t\t\t\tCLANG_ANALYZER_NONNULL = YES;\n\t\t\t\tCLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE;\n\t\t\t\tCLANG_CXX_LANGUAGE_STANDARD = \"gnu++14\";\n\t\t\t\tCLANG_CXX_LIBRARY = \"libc++\";\n\t\t\t\tCLANG_ENABLE_MODULES = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_ARC = YES;\n\t\t\t\tCLANG_ENABLE_OBJC_WEAK = YES;\n\t\t\t\tCLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;\n\t\t\t\tCLANG_WARN_BOOL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_COMMA = YES;\n\t\t\t\tCLANG_WARN_CONSTANT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;\n\t\t\t\tCLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;\n\t\t\t\tCLANG_WARN_DOCUMENTATION_COMMENTS = YES;\n\t\t\t\tCLANG_WARN_EMPTY_BODY = YES;\n\t\t\t\tCLANG_WARN_ENUM_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_INFINITE_RECURSION = YES;\n\t\t\t\tCLANG_WARN_INT_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;\n\t\t\t\tCLANG_WARN_OBJC_LITERAL_CONVERSION = YES;\n\t\t\t\tCLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;\n\t\t\t\tCLANG_WARN_RANGE_LOOP_ANALYSIS = YES;\n\t\t\t\tCLANG_WARN_STRICT_PROTOTYPES = YES;\n\t\t\t\tCLANG_WARN_SUSPICIOUS_MOVE = YES;\n\t\t\t\tCLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE;\n\t\t\t\tCLANG_WARN_UNREACHABLE_CODE = YES;\n\t\t\t\tCLANG_WARN__DUPLICATE_METHOD_MATCH = YES;\n\t\t\t\tCODE_SIGN_IDENTITY = \"iPhone Developer\";\n\t\t\t\tCOPY_PHASE_STRIP = NO;\n\t\t\t\tDEBUG_INFORMATION_FORMAT = \"dwarf-with-dsym\";\n\t\t\t\tENABLE_NS_ASSERTIONS = NO;\n\t\t\t\tENABLE_STRICT_OBJC_MSGSEND = YES;\n\t\t\t\tGCC_C_LANGUAGE_STANDARD = gnu11;\n\t\t\t\tGCC_NO_COMMON_BLOCKS = YES;\n\t\t\t\tGCC_WARN_64_TO_32_BIT_CONVERSION = YES;\n\t\t\t\tGCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;\n\t\t\t\tGCC_WARN_UNDECLARED_SELECTOR = YES;\n\t\t\t\tGCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;\n\t\t\t\tGCC_WARN_UNUSED_FUNCTION = YES;\n\t\t\t\tGCC_WARN_UNUSED_VARIABLE = YES;\n\t\t\t\tIPHONEOS_DEPLOYMENT_TARGET = 11.4;\n\t\t\t\tMTL_ENABLE_DEBUG_INFO = NO;\n\t\t\t\tSDKROOT = iphoneos;\n\t\t\t\tSWIFT_COMPILATION_MODE = wholemodule;\n\t\t\t\tSWIFT_OPTIMIZATION_LEVEL = \"-O\";\n\t\t\t\tSWIFT_VERSION = 4.2;\n\t\t\t\tVALIDATE_PRODUCT = YES;\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t349220ED20F64C6600A59A6F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = BF520BDF5160D0B847AED112 /* Pods-HDWalletKit.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = X24R65DM8E;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"'@executable_path/Frameworks'\",\n\t\t\t\t\t\"'@loader_path/Frameworks'\",\n\t\t\t\t\t\"'@executable_path/../../Frameworks'\",\n\t\t\t\t\t\"@loader_path\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t349220EE20F64C6600A59A6F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = A241CE5210CEC9DFFCA47EA2 /* Pods-HDWalletKit.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = X24R65DM8E;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"'@executable_path/Frameworks'\",\n\t\t\t\t\t\"'@loader_path/Frameworks'\",\n\t\t\t\t\t\"'@executable_path/../../Frameworks'\",\n\t\t\t\t\t\"@loader_path\",\n\t\t\t\t);\n\t\t\t\tOTHER_LDFLAGS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"-ObjC\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSKIP_INSTALL = YES;\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n\t\t3492214F20F64E0300A59A6F /* Debug */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = 24463252CD56603F58800D8F /* Pods-HDWalletKit-HDWalletKit_Tests.debug.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = P8JA7643K4;\n\t\t\t\tINFOPLIST_FILE = HDWalletKit_Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"Essentia.HDWalletKit-Tests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Debug;\n\t\t};\n\t\t3492215020F64E0300A59A6F /* Release */ = {\n\t\t\tisa = XCBuildConfiguration;\n\t\t\tbaseConfigurationReference = FE9481BAD6A096D7EC0A2E49 /* Pods-HDWalletKit-HDWalletKit_Tests.release.xcconfig */;\n\t\t\tbuildSettings = {\n\t\t\t\tCODE_SIGN_STYLE = Automatic;\n\t\t\t\tDEVELOPMENT_TEAM = P8JA7643K4;\n\t\t\t\tINFOPLIST_FILE = HDWalletKit_Tests/Info.plist;\n\t\t\t\tLD_RUNPATH_SEARCH_PATHS = (\n\t\t\t\t\t\"$(inherited)\",\n\t\t\t\t\t\"@executable_path/Frameworks\",\n\t\t\t\t\t\"@loader_path/Frameworks\",\n\t\t\t\t);\n\t\t\t\tPRODUCT_BUNDLE_IDENTIFIER = \"Essentia.HDWalletKit-Tests\";\n\t\t\t\tPRODUCT_NAME = \"$(TARGET_NAME)\";\n\t\t\t\tSWIFT_VERSION = 5.0;\n\t\t\t\tTARGETED_DEVICE_FAMILY = \"1,2\";\n\t\t\t};\n\t\t\tname = Release;\n\t\t};\n/* End XCBuildConfiguration section */\n\n/* Begin XCConfigurationList section */\n\t\t349220E020F64C6600A59A6F /* Build configuration list for PBXProject \"HDWalletKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t349220EA20F64C6600A59A6F /* Debug */,\n\t\t\t\t349220EB20F64C6600A59A6F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t349220EC20F64C6600A59A6F /* Build configuration list for PBXNativeTarget \"HDWalletKit\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t349220ED20F64C6600A59A6F /* Debug */,\n\t\t\t\t349220EE20F64C6600A59A6F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n\t\t3492215120F64E0300A59A6F /* Build configuration list for PBXNativeTarget \"HDWalletKit_Tests\" */ = {\n\t\t\tisa = XCConfigurationList;\n\t\t\tbuildConfigurations = (\n\t\t\t\t3492214F20F64E0300A59A6F /* Debug */,\n\t\t\t\t3492215020F64E0300A59A6F /* Release */,\n\t\t\t);\n\t\t\tdefaultConfigurationIsVisible = 0;\n\t\t\tdefaultConfigurationName = Release;\n\t\t};\n/* End XCConfigurationList section */\n\t};\n\trootObject = 349220DD20F64C6600A59A6F /* Project object */;\n}\n"
  },
  {
    "path": "HDWalletKit.xcodeproj/xcshareddata/xcschemes/HDWalletKit.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n      <BuildActionEntries>\n         <BuildActionEntry\n            buildForTesting = \"YES\"\n            buildForRunning = \"YES\"\n            buildForProfiling = \"YES\"\n            buildForArchiving = \"YES\"\n            buildForAnalyzing = \"YES\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"349220E420F64C6600A59A6F\"\n               BuildableName = \"libHDWalletKit.a\"\n               BlueprintName = \"HDWalletKit\"\n               ReferencedContainer = \"container:HDWalletKit.xcodeproj\">\n            </BuildableReference>\n         </BuildActionEntry>\n      </BuildActionEntries>\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"349220E420F64C6600A59A6F\"\n            BuildableName = \"libHDWalletKit.a\"\n            BlueprintName = \"HDWalletKit\"\n            ReferencedContainer = \"container:HDWalletKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n      <MacroExpansion>\n         <BuildableReference\n            BuildableIdentifier = \"primary\"\n            BlueprintIdentifier = \"349220E420F64C6600A59A6F\"\n            BuildableName = \"libHDWalletKit.a\"\n            BlueprintName = \"HDWalletKit\"\n            ReferencedContainer = \"container:HDWalletKit.xcodeproj\">\n         </BuildableReference>\n      </MacroExpansion>\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "HDWalletKit.xcodeproj/xcshareddata/xcschemes/HDWalletKit_Tests.xcscheme",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<Scheme\n   LastUpgradeVersion = \"1020\"\n   version = \"1.3\">\n   <BuildAction\n      parallelizeBuildables = \"YES\"\n      buildImplicitDependencies = \"YES\">\n   </BuildAction>\n   <TestAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\">\n      <Testables>\n         <TestableReference\n            skipped = \"NO\">\n            <BuildableReference\n               BuildableIdentifier = \"primary\"\n               BlueprintIdentifier = \"3492214620F64E0300A59A6F\"\n               BuildableName = \"HDWalletKit_Tests.xctest\"\n               BlueprintName = \"HDWalletKit_Tests\"\n               ReferencedContainer = \"container:HDWalletKit.xcodeproj\">\n            </BuildableReference>\n         </TestableReference>\n      </Testables>\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </TestAction>\n   <LaunchAction\n      buildConfiguration = \"Debug\"\n      selectedDebuggerIdentifier = \"Xcode.DebuggerFoundation.Debugger.LLDB\"\n      selectedLauncherIdentifier = \"Xcode.DebuggerFoundation.Launcher.LLDB\"\n      launchStyle = \"0\"\n      useCustomWorkingDirectory = \"NO\"\n      ignoresPersistentStateOnLaunch = \"NO\"\n      debugDocumentVersioning = \"YES\"\n      debugServiceExtension = \"internal\"\n      allowLocationSimulation = \"YES\">\n      <AdditionalOptions>\n      </AdditionalOptions>\n   </LaunchAction>\n   <ProfileAction\n      buildConfiguration = \"Release\"\n      shouldUseLaunchSchemeArgsEnv = \"YES\"\n      savedToolIdentifier = \"\"\n      useCustomWorkingDirectory = \"NO\"\n      debugDocumentVersioning = \"YES\">\n   </ProfileAction>\n   <AnalyzeAction\n      buildConfiguration = \"Debug\">\n   </AnalyzeAction>\n   <ArchiveAction\n      buildConfiguration = \"Release\"\n      revealArchiveInOrganizer = \"YES\">\n   </ArchiveAction>\n</Scheme>\n"
  },
  {
    "path": "HDWalletKit_Tests/AddressGenerationTests.swift",
    "content": "//\n//  AddressGenerationTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass AddressGenerationTests: XCTestCase {\n    func testMainnetChildKeyDerivation() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let privateKey = PrivateKey(seed: seed, coin: .bitcoin)\n        \n        // BIP44 key derivation\n        // m/44'\n        let purpose = privateKey.derived(at: .hardened(44))\n        \n        // m/44'/0'\n        let coinType = purpose.derived(at: .hardened(0))\n        \n        // m/44'/0'/0'\n        let account = coinType.derived(at: .hardened(0))\n        \n        // m/44'/0'/0'/0\n        let change = account.derived(at: .notHardened(0))\n        \n        // m/44'/0'/0'/0/0\n        let firstPrivateKey = change.derived(at: .notHardened(0))\n        XCTAssertEqual(\n            firstPrivateKey.publicKey.address,\n            \"128BCBZndgrPXzEgF4QbVR3jnQGwzRtEz5\"\n        )\n        \n        XCTAssertEqual(\n            firstPrivateKey.publicKey.compressedPublicKey.toHexString(),\n            \"03ce9b978595558053580d557ff40f9f99a4f1a7609c25268863ee64de7e4abbda\"\n        )\n    }\n    \n\n    \n    func testBitcoinMainNetAddressGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .bitcoin)\n        \n        let firstAccount = wallet.generateAccount(at: 0)\n        XCTAssertEqual(firstAccount.address, \"128BCBZndgrPXzEgF4QbVR3jnQGwzRtEz5\")\n        XCTAssertEqual(firstAccount.rawPublicKey, \"03ce9b978595558053580d557ff40f9f99a4f1a7609c25268863ee64de7e4abbda\")\n        XCTAssertEqual(firstAccount.rawPrivateKey, \"L35qaFLpbCc9yCzeTuWJg4qWnTs9BaLr5CDYcnJ5UnGmgLo8JBgk\")\n        \n        let secondAddress = wallet.generateAddress(at: 1)\n        XCTAssertEqual(secondAddress, \"1E7NvpF3u87rbpfYxt3HDmpFasPiU2JhMp\")\n        \n        let thirdAddress = wallet.generateAddress(at: 2)\n        XCTAssertEqual(thirdAddress, \"12KtZ5SXaQGT2iL89VoFQMuuutPUwXmqdL\")\n        \n        let forthAddress = wallet.generateAddress(at: 3)\n        XCTAssertEqual(forthAddress, \"1NPN2MZ2iKK4a1Bav8D4MHYVG6mTetV8xb\")\n        \n    }\n    \n    \n    func testEthereumAddressGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .ethereum)\n        \n        let firstAccount = wallet.generateAccount(at: 0)\n        XCTAssertEqual(firstAccount.address, \"0x83f1caAdaBeEC2945b73087F803d404F054Cc2B7\")\n        XCTAssertEqual(firstAccount.rawPublicKey, \"039966a68158fcf8839e7bdbc6b889d4608bd0b4afb358b073bed1d7b70dbe2f4f\")\n        XCTAssertEqual(firstAccount.rawPrivateKey, \"df02cbea58239744a8a6ba328056309ae43f86fec6db45e5f782adcf38aacadf\")\n    }\n    \n    func testLitecoinAddressGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .litecoin)\n        \n        let firstAccount = wallet.generateAccount(at: 0)\n        XCTAssertEqual(firstAccount.address, \"LV8fThzQw45HT6bCgs1yfvLNzv4aFvjJt1\")\n        XCTAssertEqual(firstAccount.rawPublicKey, \"026eeb12b93ab20b32970e2fa0e7fbaa97f9016dc743ad3efc922681ce33adc40d\")\n        XCTAssertEqual(firstAccount.rawPrivateKey, \"T3d12aqL7XSNqMojMtqBZGhQ6E93dzrdbnNUKMvdmVTa9TQn4L3m\")\n        \n        let secondAddress = wallet.generateAddress(at: 1)\n        XCTAssertEqual(secondAddress, \"Lg7bkp36nPJdqoYAfpmR1UUdXgSq9iCxBX\")\n        \n        let thirdAddress = wallet.generateAddress(at: 2)\n        XCTAssertEqual(thirdAddress, \"LRajgVNRke9ttvrnncpH52iNAbCFdSxq2b\")\n        \n        let forthAddress = wallet.generateAddress(at: 3)\n        XCTAssertEqual(forthAddress, \"LcZoNSHLQc1XGjMLy6PdqE8PtphMbRPCQ3\")\n    }\n    \n    func testDashAddressGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .dash)\n        \n        let firstAccount = wallet.generateAccount(at: 0)\n        XCTAssertEqual(firstAccount.address, \"Xud1fZjupDuhndpYtTquDPmSWmehtEbxhy\")\n        XCTAssertEqual(firstAccount.rawPublicKey, \"02f1dfce053d0a9aadb8f63ab4490ac84b33ad018c62dbabb9ff2352fe62fc4619\")\n        XCTAssertEqual(firstAccount.rawPrivateKey, \"XCHbiHeTfzwhryHEZTp3ojAM1nYpKwL575ieLLv7s4q1f5ZEm1vP\")\n        \n        let secondAddress = wallet.generateAddress(at: 1)\n        XCTAssertEqual(secondAddress, \"XbATV62bhk2P1Vkroc1QXX3vqJuSxvvDta\")\n        \n        let thirdAddress = wallet.generateAddress(at: 2)\n        XCTAssertEqual(thirdAddress, \"XoWa4HnW9u8fWQHaAPH9YirPcUZVVEdMMk\")\n        \n        let forthAddress = wallet.generateAddress(at: 3)\n        XCTAssertEqual(forthAddress, \"XnckifVkTXKkSQf3k7LKPVYaVfycuXQhZ6\")\n    }\n    \n    func testDogecoinAddressGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .dogecoin)\n        \n        let firstAccount = wallet.generateAccount(at: 0)\n        XCTAssertEqual(firstAccount.address, \"DSsPuTmCThdr1qkgJ49K1mHskypbi2LTrS\")\n        XCTAssertEqual(firstAccount.rawPublicKey, \"0372caf38ff987350d04a24cad8436b3c9337d9bc0ebab2a39682d621c34ddc99b\")\n        XCTAssertEqual(firstAccount.rawPrivateKey, \"6KJYQ2MeVTWDA7gA9YCGn2GpHwe4679QY874nLmp6U1jjHgDnHg\")\n        \n        let secondAddress = wallet.generateAddress(at: 1)\n        XCTAssertEqual(secondAddress, \"DCvD62aLgZSuAvSxbFPyyLaaSHjFNAmDye\")\n        \n        let thirdAddress = wallet.generateAddress(at: 2)\n        XCTAssertEqual(thirdAddress, \"DRa2dkLbiezQ23ubYbjUwgJRZff1GHpT7p\")\n        \n        let forthAddress = wallet.generateAddress(at: 3)\n        XCTAssertEqual(forthAddress, \"D99a5gvcaWxy5fugLymc629j8bBX33KPo9\")\n    }\n    \n    \n    func testBitcoinCashAddressGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .bitcoinCash)\n        \n        let firstAccount = wallet.generateAccount(at: 0)\n        XCTAssertEqual(firstAccount.address, \"1FYh9oXWbAzgcX3hPSrRWUodYWt87bMmne\")\n        XCTAssertEqual(firstAccount.privateKey.publicKey.generateCashAddress(),\n                       \"bitcoincash:qz0eqtpupzxvx5h2u93tew8mq4qtglyhzyjdq3ezw0\")\n        XCTAssertEqual(firstAccount.rawPublicKey, \"030f6c58f37ffe1bf56dd79fac07f339f44d96efaa3d78e1f32fadd41dcd0b7bbc\")\n        XCTAssertEqual(firstAccount.rawPrivateKey, \"KwgDcj2ZDN5vzRXsTv1F6vzQV7nx7shEYjFBcWng1sH6Fy9rhK2b\")\n        \n        let secondAccount = wallet.generateAccount(at: 1)\n        XCTAssertEqual(secondAccount.address, \"19Q2M5swtorWmL9ZdhtaxBFFuhUuBr9z1Q\")\n        XCTAssertEqual(secondAccount.privateKey.publicKey.generateCashAddress(),\n                       \"bitcoincash:qpwphvnuxqxxg9z9m4f7vkuyrzu5twjasqyfxl5x3g\")\n        \n        let thirdAccount = wallet.generateAccount(at: 2)\n        XCTAssertEqual(thirdAccount.address, \"1QDAX8eZXMjVdZxMzHyXr81uWu9ZDWd9vR\")\n        XCTAssertEqual(thirdAccount.privateKey.publicKey.generateCashAddress(),\n                       \"bitcoincash:qrlf04xqfxaum4w7dsk7s8q5utulazggfunjpz7tes\")\n        \n        let forthAccount = wallet.generateAccount(at: 3)\n        XCTAssertEqual(forthAccount.address, \"1Jgjm6m4ETPGezaoTBdJCJV7RCjDRR9Ddf\")\n        XCTAssertEqual(forthAccount.privateKey.publicKey.generateCashAddress(),\n                       \"bitcoincash:qrqlur3v8zl500w8k5lkas4re7d70zmxtqnqp5htct\")\n    }\n    \n    func testBitcoinMainNetAccountGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let wallet = Wallet(seed: seed, coin: .bitcoin)\n        let privateKey0 = bip44PrivateKey(coin: wallet.coin, from:wallet.privateKey).derived(at: .notHardened(0))\n        let privateKey1 = bip44PrivateKey(coin: wallet.coin, from:wallet.privateKey).derived(at: .notHardened(1))\n        let accounts:[String] = [Account(privateKey: privateKey0),\n                                 Account(privateKey: privateKey1)].compactMap { (account) -> String in\n                                    return account.address\n        }\n        let generatedAccounts:[String] = wallet.generateAccounts(count: 2).compactMap { (account) -> String in\n            return account.address\n        }\n        XCTAssertEqual(generatedAccounts, accounts)\n        \n    }\n    \n    func testBitcoinAddressFromPrivateKeyGeneration() {\n        let privateKey = PrivateKey(pk: \"L35qaFLpbCc9yCzeTuWJg4qWnTs9BaLr5CDYcnJ5UnGmgLo8JBgk\", coin: .bitcoin)\n        XCTAssertEqual(privateKey?.publicKey.address, \"128BCBZndgrPXzEgF4QbVR3jnQGwzRtEz5\")\n    }\n    \n    func testBitcoinCashFromPrivateKeyGeneration() {\n        let privateKey = PrivateKey(pk: \"L1a13jus2Tm8rbcJX3TMenNPCtMBD19jB4krpsfCk5mmDoZZSAft\", coin: .bitcoinCash)\n        XCTAssertEqual(privateKey?.publicKey.address, \"19Q2M5swtorWmL9ZdhtaxBFFuhUuBr9z1Q\")\n        XCTAssertEqual(privateKey?.publicKey.generateCashAddress(), \"bitcoincash:qpwphvnuxqxxg9z9m4f7vkuyrzu5twjasqyfxl5x3g\")\n    }\n    \n    func testEthereumAddressFromPrivateKeyGeneration() {\n        let privateKey = PrivateKey(pk: \"df02cbea58239744a8a6ba328056309ae43f86fec6db45e5f782adcf38aacadf\", coin: .ethereum)\n        XCTAssertEqual(privateKey?.publicKey.address, \"0x83f1caAdaBeEC2945b73087F803d404F054Cc2B7\")\n    }\n    \n    func testLitecoinAddressFromPrivateKeyGeneration() {\n        let privateKey = PrivateKey(pk: \"T3d12aqL7XSNqMojMtqBZGhQ6E93dzrdbnNUKMvdmVTa9TQn4L3m\", coin: .litecoin)\n        XCTAssertEqual(privateKey?.publicKey.address, \"LV8fThzQw45HT6bCgs1yfvLNzv4aFvjJt1\")\n    }\n    \n    func testDashAddressFromPrivateKeyGeneration() {\n        let privateKey = PrivateKey(pk: \"XJV6uhBJu5tu34hjKK2x28t9kpMUmPH4vC9xU4RDA62Yz8oKsKac\", coin: .dash)\n        XCTAssertEqual(privateKey?.publicKey.address, \"Xqe9L4R81MhQE4MX3w38zhAJyQSSiZLZXy\")\n        XCTAssertEqual(privateKey?.publicKey.address, \"Xqe9L4R81MhQE4MX3w38zhAJyQSSiZLZXy\")\n    }\n    \n    func bip44PrivateKey(coin: Coin , from: PrivateKey) -> PrivateKey {\n        let bip44Purpose:UInt32 = 44\n        let purpose = from.derived(at: .hardened(bip44Purpose))\n        let coinType = purpose.derived(at: .hardened(coin.coinType))\n        let account = coinType.derived(at: .hardened(0))\n        let receive = account.derived(at: .notHardened(0))\n        return receive\n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/ConverterTests.swift",
    "content": "//\n//  ConverterTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 10/10/18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass ConverterTests: XCTestCase {\n    \n    func testConverter() {\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"100000000000000\")!), 0.0001)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"1000000000000000\")!), 0.001)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"10000000000000000\")!), 0.01)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"100000000000000000\")!), 0.1)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"1000000000000000000\")!), 1)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"10000000000000000000\")!), 10)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"100000000000000000000\")!), 100)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"1000000000000000000000\")!), 1000)\n        \n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"0xDE0B6B3A7640000\", radix: 16)!), 1)\n        \n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"1000000000000000\")!), 0.001)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"10000000000000000\")!), 0.01)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"100000000000000000\")!), 0.1)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"1000000000000000000\")!), 1)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"10000000000000000000\")!), 10)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"100000000000000000000\")!), 100)\n        XCTAssertEqual(try! WeiEthterConverter.toEther(wei: Wei(\"1000000000000000000000\")!), 1000)\n        \n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"0.0001\")!).description, \"100000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"0.001\")!).description, \"1000000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"0.01\")!).description, \"10000000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"0.1\")!).description, \"100000000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"1\")!).description, \"1000000000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"10\")!).description, \"10000000000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"100\")!).description, \"100000000000000000000\")\n        XCTAssertEqual(try! WeiEthterConverter.toWei(ether: Ether(string: \"1000\")!).description, \"1000000000000000000000\")\n        \n        XCTAssertEqual(WeiEthterConverter.toWei(GWei: 1), 1000000000)\n        XCTAssertEqual(WeiEthterConverter.toWei(GWei: 10), 10000000000)\n        XCTAssertEqual(WeiEthterConverter.toWei(GWei: 15), 15000000000)\n        XCTAssertEqual(WeiEthterConverter.toWei(GWei: 30), 30000000000)\n        XCTAssertEqual(WeiEthterConverter.toWei(GWei: 60), 60000000000)\n        XCTAssertEqual(WeiEthterConverter.toWei(GWei: 99), 99000000000)\n    }\n    \n    func testTokensConvert() {\n        XCTAssertEqual(try! WeiEthterConverter.toToken(balance: \"0x2d79883d2000\", decimals: 12, radix: 16).description, \"50\")\n        XCTAssertEqual(try! WeiEthterConverter.toToken(balance: \"50000000000000\", decimals: 12, radix: 10).description, \"50\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/CryptoTests.swift",
    "content": "//\n//  CryptoTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass CryptoTests: XCTestCase {\n    func testSHA3Keccak256() {\n        let data = \"Hello\".data(using: .utf8)!\n        let encrypted = Crypto.sha3keccak256(data: data)\n        XCTAssertEqual(encrypted.toHexString(), \"06b3dfaec148fb1bb2b066f10ec285e7c9bf402ab32aa78a5d38e34566810cd2\")\n    }\n    \n    func testPrivateKeySign() {\n        let signer = EIP155Signer(chainId: 1)\n        \n        let rawTransaction1 = EthereumRawTransaction(\n            value: Wei(\"10000000000000000\")!,\n            to: \"0x91c79f31De5208fadCbF83f0a7B0A9b6d8aBA90F\",\n            gasPrice: 99000000000,\n            gasLimit: 21000,\n            nonce: 2\n        )\n        \n        XCTAssertEqual(\n            try! signer.hash(rawTransaction: rawTransaction1).toHexString(),\n            \"de6ed032e8f09adb557f6a0ebc16ed52d6a75e0644a77a236aa1cfffa7746e9a\"\n        )\n        \n        let rawTransaction2 = EthereumRawTransaction(\n            value: Wei(\"10000000000000000\")!,\n            to: \"0x88b44BC83add758A3642130619D61682282850Df\",\n            gasPrice: 99000000000,\n            gasLimit: 200000,\n            nonce: 4\n        )\n        \n        XCTAssertEqual(\n            try! signer.hash(rawTransaction: rawTransaction2).toHexString(),\n            \"b148272b2a985365e08abb17a85ca5e171169978f3b55e6852a035f83b9f3aa5\"\n        )\n        \n        let rawTransaction3 = EthereumRawTransaction(\n            value: Wei(\"20000000000000000\")!,\n            to: \"0x72AAb5461F9bE958E1c375285CC2aA7De89D02A1\",\n            gasPrice: 99000000000,\n            gasLimit: 21000,\n            nonce: 25\n        )\n        \n        XCTAssertEqual(\n            try! signer.hash(rawTransaction: rawTransaction3).toHexString(),\n            \"280e29f030cfa256b4298a2b834a4add92b37f159b3cce1110e1ff9f7514f9fe\"\n        )\n    }\n    \n    func testGeneratingRSV() {\n        let signature = Data(hex: \"28ef61340bd939bc2195fe537567866003e1a15d3c71ff63e1590620aa63627667cbe9d8997f761aecb703304b3800ccf555c9f3dc64214b297fb1966a3b6d8300\")\n        let signer = EIP155Signer(chainId: 1)\n        let (r, s, v) = signer.calculateRSV(signature: signature)\n        XCTAssertEqual(r, BInt(\"18515461264373351373200002665853028612451056578545711640558177340181847433846\")!)\n        XCTAssertEqual(s, BInt(\"46948507304638947509940763649030358759909902576025900602547168820602576006531\")!)\n        XCTAssertEqual(v, BInt(37))\n        let restoredSignature = signer.calculateSignature(r: r, s: s, v: v)\n        XCTAssertEqual(signature, restoredSignature)\n    }\n    \n    func testRestoringSignatureSignedWithOldScheme() {\n        let v = 27\n        let r = \"75119860711638973245538703589762310947594328712729260330312782656531560398776\"\n        let s = \"51392727032514077370236468627319183981033698696331563950328005524752791633785\"\n        let signer = EIP155Signer(chainId: 1)\n        let signature = signer.calculateSignature(r: BInt(r)!, s: BInt(s)!, v: BInt(v))\n        XCTAssertEqual(signature.toHexString(), \"a614559de76862bb1dbf8a969d8979e5bf21b72c51c96b27b3d247b728ebffb8719f40b018940ffd0880285d2196cdd31a710bf7cdda60c77632743d687dff7900\")\n        \n        let r1 = \"79425995431864040500581522255237765710685762616259654871112297909982135982384\"\n        let s1 = \"1777326029228985739367131500591267170048497362640342741198949880105318675913\"\n        let signature1 = signer.calculateSignature(r: BInt(r1)!, s: BInt(s1)!, v: BInt(v))\n        XCTAssertEqual(signature1.toHexString(), \"af998533cdac5d64594f462871a8ba79fe41d59295e39db3f069434c9862193003edee4e64d899a2c57bd726e972bb6fdb354e3abcd5846e2315ecfec332f5c900\")\n    }\n    \n    func testCreatePublicKey() {\n        let pk = PrivateKey(pk: \"L5GgBH1U8PuNuzCQGvvEH3udEXCEuJaiK96e88romhpGa1cU7JTY\", coin: .bitcoin)!\n        let publicKey = Crypto.generatePublicKey(data: pk.raw, compressed: true)\n        XCTAssertEqual(publicKey.toHexString(), \"0346a4129884b46fdb7f7977c6e90ed4c367af343494f3ff5272db721752d28ef3\")\n    }\n    \n    func bip44PrivateKey(coin: Coin , from: PrivateKey) -> PrivateKey {\n        let bip44Purpose:UInt32 = 44\n        let purpose = from.derived(at: .hardened(bip44Purpose))\n        let coinType = purpose.derived(at: .hardened(coin.coinType))\n        let account = coinType.derived(at: .hardened(0))\n        let receive = account.derived(at: .notHardened(0))\n        return receive\n    }\n\n     func testPublickKeyHashOutFromPubKeyHash() {\n        let expected = \"76a9210392030131e97b2a396691a7c1d91f6b5541649b75bda14d056797ab3cadcaf2f588ac\"\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        let privateKey = PrivateKey(seed: seed, coin: .bitcoin)\n        let publicKey = privateKey.publicKey.data\n        let hash = Script.buildPublicKeyHashOut(pubKeyHash: publicKey)\n        XCTAssertEqual(hash.toHexString(), expected)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/ERC20Tests.swift",
    "content": "//\n//  ERC20Tests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 24.09.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nfileprivate enum Constants {\n    static var ethereumAddress = \"2f5059f64D5C0c4895092D26CDDacC58751e0C3C\"\n    static var smartContractAddress = \"0x8f0921f30555624143d427b340b1156914882c10\"\n}\n\nfinal class ERC20Tests: XCTestCase {\n    var erc20Token: ERC20!\n    \n    override func setUp() {\n        erc20Token = ERC20(contractAddress: Constants.smartContractAddress, decimal: 18, symbol: \"TEST\")\n    }\n    \n    func testGenerateTransactionData() {\n        let expectations = [\"3\": \"0xa9059cbb0000000000000000000000002f5059f64d5c0c4895092d26cddacc58751e0c3c00000000000000000000000000000000000000000000000029a2241af62c0000\",\n                            \"0.25\": \"0xa9059cbb0000000000000000000000002f5059f64d5c0c4895092d26cddacc58751e0c3c00000000000000000000000000000000000000000000000003782dace9d90000\",\n                            \"0.155555\": \"0xa9059cbb0000000000000000000000002f5059f64d5c0c4895092d26cddacc58751e0c3c0000000000000000000000000000000000000000000000000228a472c6093000\",\n                            \"3000\": \"0xa9059cbb0000000000000000000000002f5059f64d5c0c4895092d26cddacc58751e0c3c0000000000000000000000000000000000000000000000a2a15d09519be00000\",\n                            \"9000\": \"0xa9059cbb0000000000000000000000002f5059f64d5c0c4895092d26cddacc58751e0c3c0000000000000000000000000000000000000000000001e7e4171bf4d3a00000\"]\n        expectations.forEach { (expectations) in\n            calculateTransaction(with: expectations.key, expentation: expectations.value)\n        }\n    }\n    \n    func calculateTransaction(with ammount: String, expentation: String) {\n        let data = try! erc20Token.generateSendBalanceParameter(toAddress: Constants.ethereumAddress, amount: ammount)\n        XCTAssertEqual(data.toHexString().addHexPrefix(), expentation)\n    }\n\n    func testGenerateGetBalanceParameter() {\n        let data = try! erc20Token.generateGetBalanceParameter(toAddress: Constants.ethereumAddress)\n        XCTAssertEqual(\n            data.toHexString().addHexPrefix(),\n            \"0x70a082310000000000000000000000002f5059f64d5c0c4895092d26cddacc58751e0c3c\"\n        )\n    }\n    \n    \n    func testSignatures() {\n        XCTAssertEqual(erc20Token.transferSignature.toHexString(), \"a9059cbb\")\n        XCTAssertEqual(erc20Token.balanceSignature.toHexString(), \"70a08231\")\n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit_Tests/ImportWalletTests.swift",
    "content": "//\n//  ImportWalletTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 5/5/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass ImportWalletTests: XCTestCase {\n    \n    func testImportBitcoinAddress() {\n        let legacy = try! LegacyAddress(\"1FYh9oXWbAzgcX3hPSrRWUodYWt87bMmne\", coin: .bitcoinCash)\n        XCTAssertEqual(legacy.data.toHexString(), \"9f902c3c088cc352eae162bcb8fb0540b47c9711\")\n        XCTAssertEqual(legacy.cashaddr, \"bitcoincash:qz0eqtpupzxvx5h2u93tew8mq4qtglyhzyjdq3ezw0\")\n        XCTAssertEqual(legacy.base58, \"1FYh9oXWbAzgcX3hPSrRWUodYWt87bMmne\")\n    }\n    \n    func testImportBitcoinCashAddress() {\n        let bch = try! BitcoinCashAddress(\"bitcoincash:qz0eqtpupzxvx5h2u93tew8mq4qtglyhzyjdq3ezw0\")\n        XCTAssertEqual(bch.data.toHexString(), \"9f902c3c088cc352eae162bcb8fb0540b47c9711\")\n        XCTAssertEqual(bch.cashaddr, \"bitcoincash:qz0eqtpupzxvx5h2u93tew8mq4qtglyhzyjdq3ezw0\")\n        XCTAssertEqual(bch.base58, \"1FYh9oXWbAzgcX3hPSrRWUodYWt87bMmne\")\n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/Info.plist",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<!DOCTYPE plist PUBLIC \"-//Apple//DTD PLIST 1.0//EN\" \"http://www.apple.com/DTDs/PropertyList-1.0.dtd\">\n<plist version=\"1.0\">\n<dict>\n\t<key>CFBundleDevelopmentRegion</key>\n\t<string>$(DEVELOPMENT_LANGUAGE)</string>\n\t<key>CFBundleExecutable</key>\n\t<string>$(EXECUTABLE_NAME)</string>\n\t<key>CFBundleIdentifier</key>\n\t<string>$(PRODUCT_BUNDLE_IDENTIFIER)</string>\n\t<key>CFBundleInfoDictionaryVersion</key>\n\t<string>6.0</string>\n\t<key>CFBundleName</key>\n\t<string>$(PRODUCT_NAME)</string>\n\t<key>CFBundlePackageType</key>\n\t<string>BNDL</string>\n\t<key>CFBundleShortVersionString</key>\n\t<string>1.0</string>\n\t<key>CFBundleVersion</key>\n\t<string>1</string>\n\t<key>BuildSystemType</key>\n\t<string>Original</string>\n</dict>\n</plist>\n"
  },
  {
    "path": "HDWalletKit_Tests/KeystoreTests.swift",
    "content": "//\n//  KeystoreTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 22.08.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass KeystoreTests: XCTestCase {\n    \n    func testKeyStoreGeneration() {\n        let data = Data(\"abandon amount liar amount expire adjust cage candy arch gather drum buyer\".utf8)\n        let passwordData =  Data(\"qwertyui\".utf8)\n        let keystore = try! KeystoreV3(data: data, passwordData: passwordData)\n        XCTAssertEqual(keystore?.keystoreParams?.crypto.cipher, \"aes-128-ctr\")\n        XCTAssertEqual(keystore?.keystoreParams?.crypto.kdf, \"scrypt\")\n        XCTAssertEqual(keystore?.keystoreParams?.crypto.kdfparams.r, 8)\n        XCTAssertEqual(keystore?.keystoreParams?.crypto.kdfparams.p, 1)\n        XCTAssertEqual(keystore?.keystoreParams?.crypto.kdfparams.n, 1024)\n        XCTAssertEqual(keystore?.keystoreParams?.crypto.kdfparams.dklen, 32)\n    }\n    \n    func testDecodeKeystore() {\n        let data = Data(\"abandon amount liar amount expire adjust cage candy arch gather drum buyer\".utf8)\n        let passwordData =  Data(\"qwertyui\".utf8)\n        let keystore = try! KeystoreV3(data: data, passwordData: passwordData)\n        guard let decoded = try? keystore?.getDecriptedKeyStore(passwordData: passwordData) else {\n            fatalError()\n        }\n        XCTAssertEqual(decoded, data)\n    }\n    \n    \n}\n"
  },
  {
    "path": "HDWalletKit_Tests/MnemonicTests.swift",
    "content": "//\n//  MnemonicTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 12.07.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass MnemonicTests: XCTestCase {\n    func testMenmonic() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        XCTAssertEqual(\n            mnemonic,\n            \"abandon amount liar amount expire adjust cage candy arch gather drum buyer\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2)\n        XCTAssertEqual(\n            mnemonic2,\n            \"pen false anchor short side same crawl enhance luggage advice crisp village\"\n        )\n    }\n    \n    func testSeedGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"3779b041fab425e9c0fd55846b2a03e9a388fb12784067bd8ebdb464c2574a05bcc7a8eb54d7b2a2c8420ff60f630722ea5132d28605dbc996c8ca7d7a8311c0\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"2bb2ea75d2891584559506b2429426722bfa81958c824affb84b37def230fe94a7da1701d550fef6a216176de786150d0a4f2b7b3770139582c1c01a6958d91a\"\n        )\n    }\n    \n    func testJapaneceGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .japanese)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"8c62436b42e641181b155fcdb62af9dd960156b9ab6fbe58880174ce48a1d97fde3d43b622c2959fd437fd1ee1dcd96ccc4ca24dbd1317d770ac2bbfede5521f\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .japanese)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"e8d3649e4947e2200e6eb7057c511dea30521bc6194a9f79229a47f0a4e632204fab0a39f8cb6f43ba1321b0c089bb248c646c53ff8ff9fdbd08875158bf2977\"\n        )\n    }\n    \n    func testKoreanGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .korean)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"c84d23b603720bc67db1b1f5f1cbfc82b760736ad8069bf283c8d5d2a5b1e2075e73208fbe8763500b572839ff3c7827917a7d8eec19b2732152f84b0ace5b70\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .korean)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"a66483b021427983eb95a39af6ae13c256874b09ad32dd70f15221bdfedc39d9d012e9e788fdba47b31b06ab68a6373904b61e2438d0bd45d8db51496727ca56\"\n        )\n    }\n    \n    func testFrenchGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .french)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"b70232fad2698ee7236b5f789e1566157f41e9b0a22b4dfa0c3325172a6fd8513e0d552a12c335737275847d5b25a24bfaad97bdb4d98541901d3bd2a9cbfcf1\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .french)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"3b89dcaa78ace0ff67c74526697c5e67c327e5b2e2c5849b4348b2c39306cb3c8db8fbd3f6965aca7d2b65b16491d39a340b2c5800ab2ae06394c5d36e7dff9e\"\n        )\n    }\n    \n    func testItalianGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .italian)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"e26a889ebae217f1115abd8d324d850927af0af43b42ed4c333b8962e1088f8ee6a829628cdbb1c70a4fd691aa6adeb40e631fc8cb3aa44746c361ba34e8be21\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .italian)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"cff35bbe31ca088b224b7e16992cacb8a73431cdb32b2300f596a9570dba9642aada67c442851d7a7bbd1c62bb5924b7dd8d3cc76e7a4acc72e13b8899904981\"\n        )\n    }\n    \n    func testSimplifiedChineseGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .simplifiedChinese)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"9859899437d054276ba8301d0a27b0c0c67c6e2863d68ed8d52e44c5ed9e0cc4132a5f6ba37c4ee8a2f2bbc498293a642c9ff497fff1f5f546cae2c165e0f089\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .simplifiedChinese)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"6a3dd51b9ef724ebfed4372c6a64f766f615b3b8b5a2c39e9b623f51d2d099e9c7f8d131c842b54982a0b1cd20eb40fa25d266d9cad989c7dde8ffea7fc25155\"\n        )\n    }\n    \n    func testTraditionalChineseGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .traditionalChinese)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"3fac393cf2327d761e8443b66f2c5bb22cc59278c5b906b07dfd0f8be91e56c7bc60038744b2a8d89844f8746686c32fbb6a9e195b5e1fe811c60dc050e8654b\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .traditionalChinese)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"2198a94952b97a89f79bf5d62e59fdc5213b6e728b08065401ef2ea1bc6056a49cea4b505d4a92ecd5532b8bbaa9f08e7b7f9707b383a09eabbdb28f04f04d3e\"\n        )\n    }\n    \n    func testSpanishGeneration() {\n        let entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\n        let mnemonic = Mnemonic.create(entropy: entropy, language: .spanish)\n        let seed = Mnemonic.createSeed(mnemonic: mnemonic)\n        XCTAssertEqual(\n            seed.toHexString(),\n            \"21d369cf994a9b2d99c938c979d9ca95ceeb7ac55589622bf57e2f53e7edf7688eb32a140ac9206dbf219376a8ffc7ecf4d642a88834a1dfb633d75a34180b60\"\n        )\n        \n        let entropy2 = Data(hex: \"a26a4821e36c7f7dccaa5484c080cefa\")\n        let mnemonic2 = Mnemonic.create(entropy: entropy2, language: .spanish)\n        let seed2 = Mnemonic.createSeed(mnemonic: mnemonic2)\n        XCTAssertEqual(\n            seed2.toHexString(),\n            \"f7f8c90b881e92fb3646e67a076006fa78c21320eeae3e034993468289eb7919f89140b0333e814d397fb0e42232cdb2dc3420016f4b5ed21dc5251630da8bf4\"\n        )\n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/PrivateKeyTests.swift",
    "content": "//\n//  PrivateKeyTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 4/18/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass PrivateKeyTests: XCTestCase {\n    \n    func testBitcoin() {\n        let address = \"1MVEQHYUv1bWiYJB77NNEEEdbmNFEoW5q6\"\n        let rawPk = \"0e66055a963cc3aecb185cf795de476cf290c88db671297da041b7f7377e6f9c\"\n        \n        let hexPk = \"0e66055a963cc3aecb185cf795de476cf290c88db671297da041b7f7377e6f9c\"\n        let uncompressedPk = \"5HvdNYs1baLY7vpnmb2osg5gZHvAFxDiBoCujs2vfTjC442rzSK\"\n        let compressedPk = \"KwhhY7djdc9EMaZw1oCytfVfbXfdrzj6newZnBqVrkyDnKVWiCmJ\"\n        [hexPk, compressedPk, uncompressedPk].forEach {\n            testImportFromPK(coin: .bitcoin, privateKey: $0, address: address, raw: rawPk)\n        }\n    }\n    \n    func testBitcoinCash() {\n        let address = \"1MVEQHYUv1bWiYJB77NNEEEdbmNFEoW5q6\"\n        let rawPk = \"0e66055a963cc3aecb185cf795de476cf290c88db671297da041b7f7377e6f9c\"\n        \n        let hexPk = \"0e66055a963cc3aecb185cf795de476cf290c88db671297da041b7f7377e6f9c\"\n        let uncompressedPk = \"5HvdNYs1baLY7vpnmb2osg5gZHvAFxDiBoCujs2vfTjC442rzSK\"\n        let compressedPk = \"KwhhY7djdc9EMaZw1oCytfVfbXfdrzj6newZnBqVrkyDnKVWiCmJ\"\n        [hexPk, uncompressedPk, compressedPk].forEach {\n            testImportFromPK(coin: .bitcoinCash, privateKey: $0, address: address, raw: rawPk)\n        }\n    }\n    \n    func testDogecoin() {\n         let address = \"DHhBBVF46Wzc8pR6swZD9GoDdX8x7MDgvw\"\n         let rawPk = \"0e66055a963cc3aecb185cf795de476cf290c88db671297da041b7f7377e6f9c\"\n         \n         let hexPk = \"0e66055a963cc3aecb185cf795de476cf290c88db671297da041b7f7377e6f9c\"\n         let uncompressedPk = \"6KetuZozmLRbBFKM474EcBNFo5w6zuRRWM661hjFZzobJoLuNCh\"\n         let compressedPk = \"KwhhY7djdc9EMaZw1oCytfVfbXfdrzj6newZnBqVrkyDnKVWiCmJ\"\n         [hexPk, uncompressedPk, compressedPk].forEach {\n             testImportFromPK(coin: .bitcoinCash, privateKey: $0, address: address, raw: rawPk)\n         }\n    }\n    \n    func testLitecoin() {\n        let address = \"Lbre6AY3tc8X2GJ2tKERVvcCA4S2EzF6wJ\"\n        let rawPk = \"857cfceb9726ba7165fdcda93c056d35a8ba9b90a8c77fac524a309d832de107\"\n        \n        let hexPk = \"857cfceb9726ba7165fdcda93c056d35a8ba9b90a8c77fac524a309d832de107\"\n        let uncompressedPk = \"6v8opvTbpSE2WwTv4rhEvSVK1jqGTXKRkWk484gxmc4TtQzDu53\"\n        let compressedPk = \"T7XTgWxQgNLVh9PoE2LcSsVxWG43E4pLF4H2nBHP9skHfjshodfM\"\n        [hexPk, uncompressedPk, compressedPk].forEach {\n            testImportFromPK(coin: .litecoin, privateKey: $0, address: address, raw: rawPk)\n        }\n    }\n    \n    func testImportFromPK(coin: Coin, privateKey: String, address: String, raw: String) {\n        let pk = PrivateKey(pk: privateKey, coin: coin)\n        XCTAssertEqual(pk!.publicKey.address, address)\n        XCTAssertEqual(pk?.raw, Data(hex: raw))\n    }\n    \n}\n\n"
  },
  {
    "path": "HDWalletKit_Tests/RIPEMD160Tests.swift",
    "content": "//\n//  RIPEMD160Tests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 4/23/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass RIPEMD160Tests: XCTestCase {\n    \n    func testEncode() {\n        let data = Data(\"Essentia\".utf8)\n        let encodedData = Data(hex: \"f70feccc344d80f6fc07ad29292c8ab3cf6753d7\")\n        let ripemd = RIPEMD160.hash(data)\n        XCTAssertEqual(ripemd, encodedData)\n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/Secp256k1Tets.swift",
    "content": "//\n//  Secp256k1Tets.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 4/23/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass Secp256k1Tets: XCTestCase {\n    \n    func testEncode() {\n        \n    }\n}\n\n"
  },
  {
    "path": "HDWalletKit_Tests/SignTransactionTests.swift",
    "content": "//\n//  SignTransactionTests.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 20.09.18.\n//  Copyright © 2018 Essentia. All rights reserved.\n//\n\nimport XCTest\n@testable import HDWalletKit\n\nclass SignTransactionTests: XCTestCase {\n    \n    func testSign() {\n        let transaction = EthereumRawTransaction(value: 0x00,\n                                                 to: \"0x0000000000000000000000000000000000000000\",\n                                                 gasPrice: 0x09184e72a000,\n                                                 gasLimit: 0x2710,\n                                                 nonce: 0x00,\n                                                 data: Data(hex: \"0x7f7465737432000000000000000000000000000000000000000000000000000000600057\"))\n        let pk = Data(hex: \"e331b6d69882b4cb4ea581d88e0b604039a3de5967688d3dcffdd2270c0fd109\")\n        let data = try! EIP155Signer(chainId: 1).sign(transaction, privateKey: pk);\n        XCTAssertEqual(\"0xf889808609184e72a00082271094000000000000000000000000000000000000000080a47f746573743200000000000000000000000000000000000000000000000000000060005726a0e334b3350ecadf15dfe6ac58c75b386e6b5e6ef997589e62368c7c74777abd67a00ace9b8c332799dd54da03c8a44c3191b456b2f067ad575d4022d3a81e9318c7\", data.toHexString().addHexPrefix())\n    }\n    \n    func testSign1() {\n        let transaction = EthereumRawTransaction(value: Wei(\"1000000000000000000\")!,\n                                                 to: \"0x91c79f31De5208fadCbF83f0a7B0A9b6d8aBA90F\",\n                                                 gasPrice: 99000000000,\n                                                 gasLimit: 21000,\n                                                 nonce: 0)\n        let pk = Data(hex: \"db173e58671248b48d2494b63a99008be473268581ca1eb78ed0b92e03b13bbc\")\n        let data = try! EIP155Signer(chainId: 1).sign(transaction, privateKey: pk);\n        XCTAssertEqual(\"0xf86c8085170cdc1e008252089491c79f31de5208fadcbf83f0a7b0a9b6d8aba90f880de0b6b3a76400008025a0f62b35ed65db13b02ccab29eeea2d29990a690a8620f8bee56b765c5357c82b8a05c266f2d429c87f8c903f7089870aa169638518c5c3a56ade8ce66ffcb5c3991\", data.toHexString().addHexPrefix())\n        \n    }\n    \n    func testBitcoinSign() {\n        let pk = PrivateKey(pk: \"L5GgBH1U8PuNuzCQGvvEH3udEXCEuJaiK96e88romhpGa1cU7JTY\", coin: .bitcoin)!\n        let lockingScript: Data = Data(hex: \"76a914e42a54ba2042e889461c7966ac6ba13eeb144a3f88ac\")\n        let txidData: Data = Data(hex: \"9ced8296cf15e67295a99aa0389229e27eae571436925db587665ba02210bcf3\")\n        let txHash: Data = Data(txidData.reversed())\n        let output = TransactionOutput(value: 524839, lockingScript: lockingScript)\n        let outpoint = TransactionOutPoint(hash: txHash, index: 352337565)\n        let utxo = UnspentTransaction(output: output, outpoint: outpoint)\n        let address = try! LegacyAddress(\"1HLqrFX5fYwKriU7LRKMQGhwpz5HuszjnK\", coin: .bitcoin)\n        let utxoWallet = UTXOWallet(privateKey: pk)\n        do {\n            let signedTx = try utxoWallet.createTransaction(to: address, amount: 0, utxos: [utxo])\n            XCTAssertEqual(signedTx, \"01000000000200000000000000001976a914b342b16a24dffc3be74ccf202e418fc22c271cbd88ac00000000000000001976a9144f5cd7cf2e4d0ec1bcbd82b64691e2f7867b618688ac00000000\")\n            \n        } catch {\n            print(error)\n        }\n        \n    }\n}\n"
  },
  {
    "path": "HDWalletKit_Tests/UTXO/UTXOSign.swift",
    "content": "//\n//  UTXOSign.swift\n//  HDWalletKit_Tests\n//\n//  Created by Pavlo Boiko on 3/26/19.\n//  Copyright © 2019 Essentia. All rights reserved.\n//\n\n\nimport XCTest\n@testable import HDWalletKit\n\nclass UTXOSign: XCTestCase {\n    func testBitcoinSign() {\n        let pk = PrivateKey(pk: \"L5GgBH1U8PuNuzCQGvvEH3udEXCEuJaiK96e88romhpGa1cU7JTY\", coin: .bitcoin)!\n        let lockingScript: Data = Data(hex: \"76a914e42a54ba2042e889461c7966ac6ba13eeb144a3f88ac\")\n        let txidData: Data = Data(hex: \"9ced8296cf15e67295a99aa0389229e27eae571436925db587665ba02210bcf3\")\n        let txHash: Data = Data(txidData.reversed())\n        let output = TransactionOutput(value: 524839, lockingScript: lockingScript)\n        let outpoint = TransactionOutPoint(hash: txHash, index: 352337565)\n        let utxo = UnspentTransaction(output: output, outpoint: outpoint)\n        let address = try! LegacyAddress(\"1HLqrFX5fYwKriU7LRKMQGhwpz5HuszjnK\", coin: .bitcoin)\n        let utxoWallet = UTXOWallet(privateKey: pk)\n        do {\n            let signedTx = try utxoWallet.createTransaction(to: address, amount: 10000, utxos: [utxo])\n            XCTAssertEqual(signedTx, \"0100000001f3bc1022a05b6687b55d92361457ae7ee2299238a09aa99572e615cf9682ed9c9d3e00156b483045022100e1283f8ac9d00d4a393f5629db9df867a1702da309a9125746f2a332c21038d20220015baf4d864254f47f08140853dd58b78f9df1749ff0e2b81ac5a9f6345b987e01210346a4129884b46fdb7f7977c6e90ed4c367af343494f3ff5272db721752d28ef3ffffffff0210270000000000001976a914b342b16a24dffc3be74ccf202e418fc22c271cbd88ac35da0700000000001976a9144f5cd7cf2e4d0ec1bcbd82b64691e2f7867b618688ac00000000\")\n        } catch {\n            print(error)\n        }\n    }\n    \n    func testBitcoinCashSign() {\n        let pk = PrivateKey(pk: \"KwgDcj2ZDN5vzRXsTv1F6vzQV7nx7shEYjFBcWng1sH6Fy9rhK2b\", coin: .bitcoinCash)!\n        let lockingScript: Data = Data(hex: \"76a914e42a54ba2042e889461c7966ac6ba13eeb144a3f88ac\")\n        let txidData: Data = Data(hex: \"9ced8296cf15e67295a99aa0389229e27eae571436925db587665ba02210bcf3\")\n        let txHash: Data = Data(txidData.reversed())\n        let output = TransactionOutput(value: 524839, lockingScript: lockingScript)\n        let outpoint = TransactionOutPoint(hash: txHash, index: 352337565)\n        let utxo = UnspentTransaction(output: output, outpoint: outpoint)\n        let address = try! LegacyAddress(\"1HLqrFX5fYwKriU7LRKMQGhwpz5HuszjnK\", coin: .bitcoinCash)\n        let utxoWallet = UTXOWallet(privateKey: pk)\n        do {\n            let signedTx = try utxoWallet.createTransaction(to: address, amount: 10000, utxos: [utxo])\n            XCTAssertEqual(signedTx, \"0100000001f3bc1022a05b6687b55d92361457ae7ee2299238a09aa99572e615cf9682ed9c9d3e00156a473044022013373441cc4521f4c4d89b454520ebedaebe4e035b5e1f9575886f1eaad4e91302200af1062f4c4e8c0633b9e3570f1d399af3f04d5ca5806bb9d62a162dfba9a2b64121030f6c58f37ffe1bf56dd79fac07f339f44d96efaa3d78e1f32fadd41dcd0b7bbcffffffff0210270000000000001976a914b342b16a24dffc3be74ccf202e418fc22c271cbd88ac35da0700000000001976a9149f902c3c088cc352eae162bcb8fb0540b47c971188ac00000000\")\n        } catch {\n            print(error)\n        }\n    }\n    \n    \n    func testDashSign() {\n        let pk = PrivateKey(pk: \"XJpB8Kdaws3YzzS4dfLBhoUmyrzMkVp3KxKg1deiHk9dnLwZYPcA\", coin: .dash)!\n        let lockingScript: Data = Data(hex: \"76a914e42a54ba2042e889461c7966ac6ba13eeb144a3f88ac\")\n        let txidData: Data = Data(hex: \"9ced8296cf15e67295a99aa0389229e27eae571436925db587665ba02210bcf3\")\n        let txHash: Data = Data(txidData.reversed())\n        let output = TransactionOutput(value: 524839, lockingScript: lockingScript)\n        let outpoint = TransactionOutPoint(hash: txHash, index: 352337565)\n        let utxo = UnspentTransaction(output: output, outpoint: outpoint)\n        let address = try! LegacyAddress(\"Xud1fZjupDuhndpYtTquDPmSWmehtEbxhy\", coin: .dash)\n        let utxoWallet = UTXOWallet(privateKey: pk)\n        do {\n            let signedTx = try utxoWallet.createTransaction(to: address, amount: 10000, utxos: [utxo])\n            XCTAssertEqual(signedTx, \"0100000001f3bc1022a05b6687b55d92361457ae7ee2299238a09aa99572e615cf9682ed9c9d3e00156a47304402202a7aaddeb07faf748ef48ffeccb0c61ee87840a468ead1dd8e4b6aa9003527470220143f1c6429662da1f0906b43bda82d1fa8c76711256502c1d08b8f9be43a42270121035d72ea3bae4502aadb86a7ab678004585ab9b27e12bbf01d13f514f9159f8adfffffffff0210270000000000001976a914cfb0ef26fa554125f6dbae9762f9b914bc823bc388ac35da0700000000001976a914553869406141a4145ed9050737266c4a4790b2b088ac00000000\")\n        } catch {\n            print(error)\n        }\n    }\n    \n    func testRawTransactionCration() {\n        let pk = PrivateKey(pk: \"L5VqJYoBWVKwe3icNjSGz5maPmAaSm32TEjPdxMNyix8groNubU8\", coin: .bitcoin)!\n        print(pk.publicKey.address)\n    }\n}\n"
  },
  {
    "path": "LICENSE.md",
    "content": "MIT License\n\nCopyright (c) 2018 Pavlo Boiko\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n"
  },
  {
    "path": "Podfile",
    "content": "platform :ios, '11.0'\n\ntarget 'HDWalletKit' do\n    use_frameworks!\n    pod 'secp256k1.swift', '~> 0.1.4'\n    pod 'CryptoSwift', '~> 1.0.0'\n\n    target 'HDWalletKit_Tests' do\n        pod 'CryptoSwift', '~> 1.0.0'\n\tpod 'secp256k1.swift', '~> 0.1.4'\n    end\nend\n"
  },
  {
    "path": "README.md",
    "content": "[![Build Status](https://travis-ci.com/essentiaone/HDWallet.svg?branch=develop)](https://travis-ci.com/essentiaone/HDWallet)\n[![Black Duck Security Risk](https://copilot.blackducksoftware.com/github/repos/essentiaone/HDWallet/branches/develop/badge-risk.svg)](https://copilot.blackducksoftware.com/github/repos/essentiaone/HDWallet/branches/develop)\n[![Badge w/ Version](https://cocoapod-badges.herokuapp.com/v/HDWalletKit/badge.png)](https://cocoadocs.org/docsets/HDWalletKit)\n[![Badge w/ Platform](https://cocoapod-badges.herokuapp.com/p/HDWalletKit/badge.svg)](https://cocoadocs.org/docsets/HDWalletKit)\n[![Badge w/ Licence](https://cocoapod-badges.herokuapp.com/l/HDWalletKit/badge.svg)](https://cocoadocs.org/docsets/HDWalletKit)\n\n# HDWalletKit\nHDWalletKit is a Swift framwork that enables you to create and use bitcoin HD wallet ([Hierarchical Deterministic Wallets](https://github.com/bitcoin/bips/blob/master/bip-0032.mediawiki)) in your own app.\n<p>\n<img src=\"https://clogos.essdev.info/64x64/bitcoin.png\" >  <img src=\"https://clogos.essdev.info/64x64/bitcoin-cash.png\" >  <img src=\"https://clogos.essdev.info/64x64/litecoin.png\" > <img src=\"https://clogos.essdev.info/64x64/dash.png\" > <img src=\"https://clogos.essdev.info/64x64/ethereum.png\" > <img src=\"https://clogos.essdev.info/64x64/erc20.png\" >\n</p>\nYou can check if the address generation is working right [here](https://iancoleman.io/bip39/).\n\n## Features\n- HD and NonHD wallets support\n- Mnemonic recovery phrease in [BIP39](https://github.com/bitcoin/bips/blob/master/bip-0039.mediawiki)\n- Keystore generation\n- Read keystore file\n- Sign ether transaction\n- ERC20 Tokens\n- Sign UTXO based transaction\n\n## Installation\n### CocoaPods\n<p>To integrate HDWalletKit into your Xcode project using <a href=\"http://cocoapods.org\">CocoaPods</a>, specify it in your <code>Podfile</code>:</p>\n<pre><code class=\"ruby language-ruby\">pod 'HDWalletKit'</code></pre>\n\n### Carthage\nTo install with [Carthage](https://github.com/Carthage/Carthage), simply add this in your `Cartfile`:\n```ruby\ngithub \"essentiaone/HDWallet\"\n```\n## Communication\n\n- If you **found a bug**, open an issue.\n- If you **have a feature request**, open an issue.\n- If you **want to contribute**, submit a pull request.\n## How to use\n#### Generate seed and convert it to mnemonic sentence.\n```swift\nlet entropy = Data(hex: \"000102030405060708090a0b0c0d0e0f\")\nlet mnemonic = Mnemonic.create(entropy: entropy)\nprint(mnemonic)\n// abandon amount liar amount expire adjust cage candy arch gather drum buyer\n\nlet seed = Mnemonic.createSeed(mnemonic: mnemonic)\nprint(seed.toHexString())\n```\n#### PrivateKey and key derivation (BIP39)\n\n```swift\nlet mnemonic = Mnemonic.create()\nlet seed = Mnemonic.createSeed(mnemonic: mnemonic)\nlet privateKey = PrivateKey(seed: seed, coin: .bitcoin)\n\n// BIP44 key derivation\n// m/44'\nlet purpose = privateKey.derived(at: .hardened(44))\n\n// m/44'/0'\nlet coinType = purpose.derived(at: .hardened(0))\n\n// m/44'/0'/0'\nlet account = coinType.derived(at: .hardened(0))\n\n// m/44'/0'/0'/0\nlet change = account.derived(at: .notHardened(0))\n\n// m/44'/0'/0'/0/0\nlet firstPrivateKey = change.derived(at: .notHardened(0))\nprint(firstPrivateKey.publicKey.address)\n```\n#### Generate keystore file\n```swift\nlet data = \"abandon amount liar amount expire adjust cage candy arch gather drum buyer\"\nlet keystore = try! KeystoreV3(data: data, password: \"qwertyui\")\nlet encodedKeystoreDaya = (try? keystore?.encodedData())\n```\n#### Open keystore file\n```swift\nlet keystore = try! KeystoreV3(data: encodedKeystoreDaya, password: password)\nguard let decoded = try? keystore?.getDecriptedKeyStore(password: password) else {\nfatalError()\n}\nprint(decoded)\n```\n#### Create your wallet and generate address\n```swift\nlet mnemonic = Mnemonic.create()\nlet seed = Mnemonic.createSeed(mnemonic: mnemonic)\nlet network: Network = .main(.bitcoin)\nlet wallet = Wallet(seed: seed, network: network)\nlet account = wallet.generateAccount()\nprint(account)\n```\n#### Sign Ethereum transaction by private key\n```swift\nlet signer = EIP155Signer()\nlet rawTransaction1 = EthereumRawTransaction(\n    value: Wei(\"10000000000000000\")!,\n    to: \"0x34205555576717bBdF8158E2b2c9ed64EB1e6B85\",\n    gasPrice: 99000000000,\n    gasLimit: 21000,\n    nonce: 2\n)\nguard let signed = try? signer.hash(rawTransaction: rawTransaction1).toHexString() else { return }\nprint(signed)\n```\n\n#### Sign Bitcoin transaction by private key\nFor getting UTXO you can use (https://github.com/essentiaone/essentia-bridges-api-ios)\n```swift\nlet address = try LegacyAddress(\"1HLqrFX5fYwKriU7LRKMQGhwpz5HuszjnK\", coin: .bitcoin)\nlet utxoWallet = UTXOWallet(privateKey: \"Kz9UKkL6bKE92QPxQbPcqkCZTnCyLVyfRNFRSbToNjyb4bx321fh\")\nlet signedTx = try utxoWallet.createTransaction(to: address, amount: 0, utxos: utxos)\n```\n\n#### Create send ERC20 tokens transaction data \n```swift\nlet erc20Token = ERC20(contractAddress: \"0x8f0921f30555624143d427b340b1156914882c10\", decimal: 18, symbol: \"ESS\")\nlet address = \"0x2f5059f64D5C0c4895092D26CDDacC58751e0C3C\"\nlet data = try! erc20Token.generateDataParameter(toAddress: address, amount: \"3\") \n```\n#### Create get balance ERC20 token transaction data \n```swift\nlet erc20Token = ERC20(contractAddress: \"0x8f0921f30555624143d427b340b1156914882c10\", decimal: 18, symbol: \"ESS\")\nlet data = try! erc20Token.generateGetBalanceParameter(toAddress: \"2f5059f64D5C0c4895092D26CDDacC58751e0C3C\")\n```\n#### Convert non HD PrivateKey to Address\n```swift\nlet privateKey = PrivateKey(pk: \"L35qaFLpbCc9yCzeTuWJg4qWnTs9BaLr5CDYcnJ5UnGmgLo8JBgk\", coin: .bitcoin)\nprint(privateKey.publicKey.address)\n//128BCBZndgrPXzEgF4QbVR3jnQGwzRtEz5\n```\n\n## License\nWalletKit is released under the [MIT License](https://github.com/essentiaone/HDWallet/blob/develop/LICENSE.md).\n"
  },
  {
    "path": "scripts/coverage.rb",
    "content": "project_name = ARGV[0]\nprofdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first\nDir.glob(File.join('build', \"/**/#{project_name}\")) do |target|\n  output = `xcrun llvm-cov report -instr-profile \"#{profdata}\" \"#{target}\" -arch=x86_64`\n  if $?.success?\n    puts output\n    `xcrun llvm-cov show -instr-profile \"#{profdata}\" \"#{target}\" -arch=x86_64 -use-color=0 > coverage.txt`\n    break\n  end\nend\n\n"
  }
]