System.err.println("DEBUG: InsetBg (after) = "+substitutions.getProperty("InsetBg"));
		public Manifest(File manifestFile, Map<String,String> macros)		throws IOException {			// load document			Document document = null;			try {				DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();				factory.setNamespaceAware(true);				factory.setValidating(false);				DocumentBuilder builder = factory.newDocumentBuilder();				document = builder.parse(manifestFile);			}			catch (IOException e) {				throw e;			}			catch (Exception e) {				throw new IOException(e.getMessage());			}			// gather files			File skinDir = manifestFile.getParentFile();			getFiles(document, E_SUBSTITUTIONS, skinDir, substList);			getFiles(document, E_CSS, skinDir, cssList);			getFiles(document, E_HTML, skinDir, htmlList);			// process substitutions			for (File file : substList) {				System.err.println("DEBUG: subst file = "+file);				try {					CharArrayWriter out = new CharArrayWriter(4096); // 4K					SkinResources.preprocess(file, out, macros, null, "#", "#", "#");					String content = out.toString();					// NOTE: properties files should be ASCII with					//       escaped Unicode char sequences.					byte[] bytes = content.getBytes("US-ASCII");					InputStream in = new ByteArrayInputStream(bytes);					substitutions.load(in);				}				catch (Throwable t) {					System.err.println("ERROR loading subst file!");				}				System.err.println("DEBUG: _SkinName_ = "+substitutions.getProperty("_SkinName_"));			}			Stack<String> stack = new Stack<String>();			Enumeration substKeys = substitutions.propertyNames();			while (substKeys.hasMoreElements()) {				stack.removeAllElements();				String substKey = (String)substKeys.nextElement();				String substValue = getProperty(stack, substKey);				/*** NOTE: This is done implicitly in getProperty				substitutions.setProperty(substKey, substValue);				/***/			}			System.err.println("DEBUG: _SkinName_ = "+substitutions.getProperty("_SkinName_"));		}