@Nullable
    public static List<Trackable> parseInventory(final String page) {
        try {
            final MatcherWrapper matcherInventory = new MatcherWrapper(GCConstants.PATTERN_INVENTORY, page);
            if (matcherInventory.find()) {
                final String inventoryPre = matcherInventory.group();

                final ArrayList<Trackable> inventory = new ArrayList<>();
                if (StringUtils.isNotBlank(inventoryPre)) {
                    final MatcherWrapper matcherInventoryInside = new MatcherWrapper(GCConstants.PATTERN_INVENTORYINSIDE, inventoryPre);

                    while (matcherInventoryInside.find()) {
                        final boolean isGeocode = "TB".equals(matcherInventoryInside.group(1));
                        final String tbId = matcherInventoryInside.group(2);
                        final Trackable inventoryItem = new Trackable();
                        inventoryItem.setGeocode(isGeocode ? tbId : null);
                        inventoryItem.setGuid(isGeocode ? null : tbId);
                        inventoryItem.forceSetBrand(TrackableBrand.TRAVELBUG);
                        inventoryItem.setName(matcherInventoryInside.group(3));

                        inventory.add(inventoryItem);
                    }
                }
                return inventory;
            }
        } catch (final RuntimeException e) {
            // failed to parse cache inventory
            Log.w("GCParser.parseCache: Failed to parse cache inventory (2)", e);
        }
        return null;
    }
Parse cache from text and return either an error code or a cache object in a pair. Note that inline logs are
not parsed nor saved, while the cache itself is.

@param pageIn  the page text to parse
@param handler the handler to send the progress notifications to
@return a pair, with a {@link StatusCode} on the left, and a non-null cache object on the right
iff the status code is {@link StatusCode#NO_ERROR}.
main/src/main/java/cgeo/geocaching/connector/gc/GCParser.java