/*
 * Copyright 2000-2013 JetBrains s.r.o.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package icons;

import com.intellij.openapi.util.IconLoader;

import javax.swing.*;

/**
 * NOTE THIS FILE IS AUTO-GENERATED
 * DO NOT EDIT IT BY HAND, run build/scripts/icons.gant instead
 */
public class SvnIcons {
  private static Icon load(String path) {
    return IconLoader.getIcon(path, SvnIcons.class);
  }

  public static final Icon AllRevisions = load("/icons/allRevisions.png"); // 16x16
  public static final Icon Common = load("/icons/Common.png"); // 16x16
  public static final Icon ConfigureBranches = load("/icons/ConfigureBranches.png"); // 16x16
  public static final Icon Conflictc = load("/icons/conflictc.png"); // 16x16
  public static final Icon Conflictcp = load("/icons/conflictcp.png"); // 16x16
  public static final Icon Conflictct = load("/icons/conflictct.png"); // 16x16
  public static final Icon Conflictctp = load("/icons/conflictctp.png"); // 16x16
  public static final Icon Conflictp = load("/icons/conflictp.png"); // 16x16
  public static final Icon Conflictt = load("/icons/conflictt.png"); // 16x16
  public static final Icon Conflicttp = load("/icons/conflicttp.png"); // 16x16
  public static final Icon FilterIntegrated = load("/icons/FilterIntegrated.png"); // 16x16
  public static final Icon FilterNotIntegrated = load("/icons/FilterNotIntegrated.png"); // 16x16
  public static final Icon FilterOthers = load("/icons/FilterOthers.png"); // 16x16
  public static final Icon Integrated = load("/icons/Integrated.png"); // 16x16
  public static final Icon IntegrateToBranch = load("/icons/IntegrateToBranch.png"); // 16x16
  public static final Icon IntegrationStatusUnknown = load("/icons/IntegrationStatusUnknown.png"); // 16x16
  public static final Icon MarkAsMerged = load("/icons/MarkAsMerged.png"); // 16x16
  public static final Icon MarkAsNotMerged = load("/icons/MarkAsNotMerged.png"); // 16x16
  public static final Icon MergeSourcesDetails = load("/icons/mergeSourcesDetails.png"); // 16x16
  public static final Icon Notintegrated = load("/icons/Notintegrated.png"); // 16x16
  public static final Icon OnDefault = load("/icons/OnDefault.png"); // 16x16
  public static final Icon PropertiesDiff = load("/icons/PropertiesDiff.png"); // 16x16
  public static final Icon PropertiesDiffWithLocal = load("/icons/PropertiesDiffWithLocal.png"); // 16x16
  public static final Icon ShowIntegratedFrom = load("/icons/ShowIntegratedFrom.png"); // 16x16
  public static final Icon ShowIntegratedTo = load("/icons/ShowIntegratedTo.png"); // 16x16
  public static final Icon ShowWorkingCopies = load("/icons/ShowWorkingCopies.png"); // 16x16
  public static final Icon UndoIntegrateToBranch = load("/icons/UndoIntegrateToBranch.png"); // 16x16
}
