     static let unsignedConversionConstant: UInt64 = UInt64(bitPattern: Int64.min)
     static let signedConversionConstant: Int64 = Int64.min
     
-    init(latitude: QuadKeyDegrees, longitude: QuadKeyDegrees) {
+    public init(latitude: QuadKeyDegrees, longitude: QuadKeyDegrees) {
         self.init(latitudePart: QuadKeyPart(latitude: latitude), longitudePart: QuadKeyPart(longitude: longitude), precision: QuadKeyPrecision.max)
     }
 
-    init(latitude: QuadKeyDegrees, longitude: QuadKeyDegrees, precision: QuadKeyPrecision) {
+    public init(latitude: QuadKeyDegrees, longitude: QuadKeyDegrees, precision: QuadKeyPrecision) {
         self.init(latitudePart: QuadKeyPart(latitude: latitude, precision: precision), longitudePart: QuadKeyPart(longitude: longitude, precision: precision), precision: precision)
     }
     
-    init(latitudePart: QuadKeyPart, longitudePart: QuadKeyPart, precision: QuadKeyPrecision) {
+    public init(latitudePart: QuadKeyPart, longitudePart: QuadKeyPart, precision: QuadKeyPrecision) {
         var quadKey: QuadKey = 0
         let max: QuadKey = QuadKey(precision) - 1
         let quadKeyLongitudePart = QuadKey(longitudePart)

    static let latitudeToPartConstant: QuadKeyDegrees =  QuadKeyDegrees(QuadKeyPart.max) / latitudeRangeLength
    static let longitudeToPartConstant: QuadKeyDegrees =  QuadKeyDegrees(QuadKeyPart.max) / longitudeRangeLength
    
    init(latitudePart: QuadKeyPart, precision: QuadKeyPrecision) {
        self.init(QuadKeyDegrees.latitudeRangeLength*QuadKeyDegrees(latitudePart)/QuadKeyDegrees(QuadKeyPart.max(atPrecision: precision)) - QuadKeyDegrees.latitudeMax)
    }
    
    init(longitudePart: QuadKeyPart, precision: QuadKeyPrecision) {
        self.init(QuadKeyDegrees.longitudeRangeLength*QuadKeyDegrees(longitudePart)/QuadKeyDegrees(QuadKeyPart.max(atPrecision: precision)) - QuadKeyDegrees.longitudeMax)
    }
    
    init(latitudePart: QuadKeyPart) {
        self.init(QuadKeyDegrees(latitudePart)*QuadKeyDegrees.partToLatitudeConstant - QuadKeyDegrees.latitudeMax)
    }
    
    init(longitudePart: QuadKeyPart) {
        self.init(QuadKeyDegrees(longitudePart)*QuadKeyDegrees.partToLongitudeConstant - QuadKeyDegrees.longitudeMax)
    }
    
    var latitudePart: QuadKeyPart {
        get {
            return QuadKeyPart(latitude: self)
        }
    }
    
    var longitudePart: QuadKeyPart {
        get {
            return QuadKeyPart(longitude: self)
        }
    }
    
    func latitudePart(atPrecision precision: QuadKeyPrecision) -> QuadKeyPart {
        return QuadKeyPart(latitude: self, precision: precision)
    }
    
    func longitudePart(atPrecision precision: QuadKeyPrecision) -> QuadKeyPart {
        return QuadKeyPart(longitude: self, precision: precision)
    }
}

public extension QuadKeyPart {
    
    init(latitude: QuadKeyDegrees) {
        let nonZeroLatitude = latitude + QuadKeyDegrees.latitudeMax
        let partInDegrees = nonZeroLatitude * QuadKeyDegrees.latitudeToPartConstant
        self.init(QuadKeyPart(partInDegrees.rounded()))
    }
    
    init(longitude: QuadKeyDegrees) {
        let nonZeroLongitude = longitude + QuadKeyDegrees.longitudeMax
        let partInDegrees = nonZeroLongitude * QuadKeyDegrees.longitudeToPartConstant
        self.init(QuadKeyPart(partInDegrees.rounded()))
    }
    
    init(latitude: QuadKeyDegrees, precision: QuadKeyPrecision) {
        let fullPart = QuadKeyPart(latitude: latitude)
        let part = fullPart >> QuadKeyPart(QuadKeyPrecision.max - precision)
        self.init(part)
    }
    
    init(longitude: QuadKeyDegrees, precision: QuadKeyPrecision) {
        let fullPart = QuadKeyPart(longitude: longitude)
        let part = fullPart >> QuadKeyPart(QuadKeyPrecision.max - precision)
        self.init(part)
    }
    
    static func max(atPrecision precision: QuadKeyPrecision) -> QuadKeyPart {
        return QuadKeyPart(QuadKey(1) << QuadKey(precision) - 1)
    }
    
    var latitude: QuadKeyDegrees {
        get {
            return QuadKeyDegrees(latitudePart: self)
        }
    }
    
    var longitude: QuadKeyDegrees {
        get {
            return QuadKeyDegrees(longitudePart: self)
        }
    }
    
    func latitude(atPrecision precision: QuadKeyPrecision) -> QuadKeyDegrees {
        return QuadKeyDegrees(latitudePart: self, precision: precision)
    }
    
    func longitude(atPrecision precision: QuadKeyPrecision) -> QuadKeyDegrees {
        return QuadKeyDegrees(longitudePart: self, precision: precision)
    }
    
    var bitmaskString: String {
        var string = ""
        var value = self
        for _ in 1...32 {

public extension QuadKeyPrecision {
    static let max: QuadKeyPrecision = 32
    
    public var deltaLatitude: QuadKeyDegrees {
        get {
            return QuadKeyDegrees.latitudeRangeLength/QuadKeyDegrees(1 << QuadKey(self))
        }
    }
    
    public var deltaLongitude: QuadKeyDegrees {
        get {
            return QuadKeyDegrees.longitudeRangeLength/QuadKeyDegrees(1 << QuadKey(self))
        }
