text: /* */ 
  "format cjs";
  var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
      var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
      if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
      else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
      return c > 3 && r && Object.defineProperty(target, key, r), r;
  };
  var __metadata = (this && this.__metadata) || function (k, v) {
      if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
  };
  import { resolveForwardRef, Injectable } from 'angular2/src/core/di';
  import { isPresent, stringify } from 'angular2/src/facade/lang';
  import { BaseException } from 'angular2/src/facade/exceptions';
  import { ListWrapper, StringMapWrapper } from 'angular2/src/facade/collection';
  import { DirectiveMetadata, ComponentMetadata, InputMetadata, OutputMetadata, HostBindingMetadata, HostListenerMetadata, ContentChildrenMetadata, ViewChildrenMetadata, ContentChildMetadata, ViewChildMetadata } from 'angular2/src/core/metadata';
  import { reflector } from 'angular2/src/core/reflection/reflection';
  function _isDirectiveMetadata(type) {
      return type instanceof DirectiveMetadata;
  }
  /*
   * Resolve a `Type` for {@link DirectiveMetadata}.
   *
   * This interface can be overridden by the application developer to create custom behavior.
   *
   * See {@link Compiler}
   */
  export let DirectiveResolver = class {
      /**
       * Return {@link DirectiveMetadata} for a given `Type`.
       */
      resolve(type) {
          var typeMetadata = reflector.annotations(resolveForwardRef(type));
          if (isPresent(typeMetadata)) {
              var metadata = typeMetadata.find(_isDirectiveMetadata);
              if (isPresent(metadata)) {
                  var propertyMetadata = reflector.propMetadata(type);
                  return this._mergeWithPropertyMetadata(metadata, propertyMetadata, type);
              }
          }
          throw new BaseException(`No Directive annotation found on ${stringify(type)}`);
      }
      _mergeWithPropertyMetadata(dm, propertyMetadata, directiveType) {
          var inputs = [];
          var outputs = [];
          var host = {};
          var queries = {};
          StringMapWrapper.forEach(propertyMetadata, (metadata, propName) => {
              metadata.forEach(a => {
                  if (a instanceof InputMetadata) {
                      if (isPresent(a.bindingPropertyName)) {
                          inputs.push(`${propName}: ${a.bindingPropertyName}`);
                      }
                      else {
                          inputs.push(propName);
                      }
                  }
                  if (a instanceof OutputMetadata) {
                      if (isPresent(a.bindingPropertyName)) {
                          outputs.push(`${propName}: ${a.bindingPropertyName}`);
                      }
                      else {
                          outputs.push(propName);
                      }
                  }
                  if (a instanceof HostBindingMetadata) {
                      if (isPresent(a.hostPropertyName)) {
                          host[`[${a.hostPropertyName}]`] = propName;
                      }
                      else {
                          host[`[${propName}]`] = propName;
                      }
                  }
                  if (a instanceof HostListenerMetadata) {
                      var args = isPresent(a.args) ? a.args.join(', ') : '';
                      host[`(${a.eventName})`] = `${propName}(${args})`;
                  }
                  if (a instanceof ContentChildrenMetadata) {
                      queries[propName] = a;
                  }
                  if (a instanceof ViewChildrenMetadata) {
                      queries[propName] = a;
                  }
                  if (a instanceof ContentChildMetadata) {
                      queries[propName] = a;
                  }
                  if (a instanceof ViewChildMetadata) {
                      queries[propName] = a;
                  }
              });
          });
          return this._merge(dm, inputs, outputs, host, queries, directiveType);
      }
      _merge(dm, inputs, outputs, host, queries, directiveType) {
          var mergedInputs = isPresent(dm.inputs) ? ListWrapper.concat(dm.inputs, inputs) : inputs;
          var mergedOutputs;
          if (isPresent(dm.outputs)) {
              dm.outputs.forEach((propName) => {
                  if (ListWrapper.contains(outputs, propName)) {
                      throw new BaseException(`Output event '${propName}' defined multiple times in '${stringify(directiveType)}'`);
                  }
              });
              mergedOutputs = ListWrapper.concat(dm.outputs, outputs);
          }
          else {
              mergedOutputs = outputs;
          }
          var mergedHost = isPresent(dm.host) ? StringMapWrapper.merge(dm.host, host) : host;
          var mergedQueries = isPresent(dm.queries) ? StringMapWrapper.merge(dm.queries, queries) : queries;
          if (dm instanceof ComponentMetadata) {
              return new ComponentMetadata({
                  selector: dm.selector,
                  inputs: mergedInputs,
                  outputs: mergedOutputs,
                  host: mergedHost,
                  exportAs: dm.exportAs,
                  moduleId: dm.moduleId,
                  queries: mergedQueries,
                  changeDetection: dm.changeDetection,
                  providers: dm.providers,
                  viewProviders: dm.viewProviders
              });
          }
          else {
              return new DirectiveMetadata({
                  selector: dm.selector,
                  inputs: mergedInputs,
                  outputs: mergedOutputs,
                  host: mergedHost,
                  exportAs: dm.exportAs,
                  queries: mergedQueries,
                  providers: dm.providers
              });
          }
      }
  };
  DirectiveResolver = __decorate([
      Injectable(), 
      __metadata('design:paramtypes', [])
  ], DirectiveResolver);
  export var CODEGEN_DIRECTIVE_RESOLVER = new DirectiveResolver();
  