////////////////////////////////////////////////////////////////////////////////
//
//  Licensed to the Apache Software Foundation (ASF) under one or more
//  contributor license agreements.  See the NOTICE file distributed with
//  this work for additional information regarding copyright ownership.
//  The ASF licenses this file to You 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 {
	
	public class Radii8LibraryEffectsAssets {
		
		public function Radii8LibraryEffectsAssets() {
			
		}
		
		
		///////////////////////////////////////////////////////
		// EDIT
		///////////////////////////////////////////////////////
		
		[Embed(source="assets/icons/effects/pause.png")]
		public static const pause:Class;
		
		[Embed(source="assets/icons/effects/play.png")]
		public static const play:Class;
		
		[Embed(source="assets/icons/effects/playpause.png")]
		public static const playpause:Class;
		
		[Embed(source="assets/icons/effects/reverse.png")]
		public static const reverse:Class;
		
		[Embed(source="assets/icons/effects/refresh.png")]
		public static const refresh:Class;
		
		[Embed(source="assets/icons/effects/stop.png")]
		public static const stop:Class;
		
		[Embed(source="assets/icons/effects/clear.png")]
		public static const clear:Class;
		
		[Embed(source="assets/icons/effects/playhead.png")]
		public static const playhead:Class;
		
		[Embed(source="assets/icons/effects/playhead_light.png")]
		public static const playheadLight:Class;
		
		[Embed(source="assets/icons/effects/end.png")]
		public static const end:Class;
		
		[Embed(source="assets/icons/effects/close_16.png")]
		public static const close:Class;
		
		[Embed(source="assets/icons/effects/loop_off.png")]
		public static const loopOff:Class;
		
		[Embed(source="assets/icons/effects/loop_on.png")]
		public static const loopOn:Class;
		
		[Embed(source="assets/icons/effects/selected.png")]
		public static const selected:Class;
		
		
		
		
	}
}