@Override public int decode(
			byte[] data, int offset, DecodeState ds, CerealDecoder context
		) throws InvalidEncoding, ResourceNotFound {
			long propDecodeResult = NumberEncoding.readUnsignedBase128(data, offset); 
			long props = NumberEncoding.base128Value(propDecodeResult); 
			offset += NumberEncoding.base128Skip(propDecodeResult);
			
			if( (props | KNOWN_PROP_MASK) != KNOWN_PROP_MASK ) {
				throw new InvalidEncoding(String.format("Unknown block properties encoded: %x", props));
			}
			
			long bitAddress = 0;
			long flags = 0;
			Icon icon = null;
			BlockInternals internals = BoringBlockInternals.INSTANCE;
			
			if( (props & PROP_INTERNALS) != 0 ) {
				internals = context.removeStackItem(ds, -1, BlockInternals.class);
			}
			if( (props & PROP_ICON) != 0 ) {
				icon = context.removeStackItem(ds, -1, Icon.class);
			}
			if( (props & PROP_FLAGS) != 0 ) {
				flags = context.removeStackItem(ds, -1, Number.class).longValue();
			}
			if( (props & PROP_BIT_ADDRESS) != 0 ) {
				bitAddress = context.removeStackItem(ds, -1, Number.class).longValue();
			}
			
			// TODO: We should probably have the no-icon-specified case be Icon.INVISIBLE or something
			if( icon == null ) throw new InvalidEncoding("Block encoded with no icon");
			
			ds.pushStackItem(new Block(bitAddress, flags, icon, internals));
			
			return offset;
		}