private function getCharacterAssetLocations(): array
    {

        $assets = CharacterAsset::where('character_id', $this->getCharacterId())
            ->where('location_flag', 'Hangar')
            ->where('location_type', 'other')
            // Asset Safety
            ->where('location_id', '<>', self::ASSET_SAFETY)
            // Solar Systems
            ->whereNotBetween('location_id', self::SOLAR_SYSTEMS_RANGE)
            // Bugged Assets
            ->whereNotBetween('location_id', self::BUGGED_ASSETS_RANGE)
            // Station / Outpost
            ->whereNotBetween('location_id', self::UPWELL_STRUCTURES_RANGE)
            // stuffs
            ->whereNotIn('location_id', function ($query) {
                $query->select('item_id')
                    ->from((new CharacterAsset)->getTable())
                    ->where('character_id', $this->getCharacterId())
                    ->distinct();
            })
            // Remove structures that already have a name resolved
            // within the last week.
            ->whereNotIn('location_id', function ($query) {

                $query->select('structure_id')
                    ->from((new UniverseStructure)->getTable())
                    ->where('name', '<>', 'Unknown Structure')
                    ->where('updated_at', '<', carbon('now')->subWeek());
            })
            ->select('location_id')->distinct()
            // Until CCP can sort out this endpoint, pick 30 random locations
            // and try to get those names. We hard cap it at 30 otherwise we
            // will quickly kill the error limit, resulting in a ban.
            ->inRandomOrder()
            ->limit(15)
            ->get();

        return $assets->map(function ($asset) {

            return $asset->location_id;

        })->all();
    }